Pergunta

Eu tenho um problema com meu módulo web classpath no Websphere v6.1.

Na minha WEB-INF / lib Eu tenho um número bastante largo de arquivos jar que incluem xercesImpl.jar e xmlparserv2.jar. Preciso das duas jarras de estar presente, mas eles parecem confict uns com os outros. Especificamente, cada frasco contém um diretório / serviços META-INF assim, quando tentamos obter uma instância de um DocumentBuilderFactory via JAXP, qual instância obtemos depende da ordem em que esses dois frascos aparecem no classpath.

I sempre quiser usar o exemplo xerces do DocumentBuildFactory, então eu quero empurrar xercesImpl.jar à frente do classpath. Eu tentei fazer isso especificando uma seção Class-Path no arquivo de manifesto para o arquivo de guerra, mas o caminho da classe que eu realmente ficar no meu ERA Módulo Composto classe Loader in é muito estranho. I parecem ter algumas coisas padrão que foi coloca em, seguido pelo conteúdo da lib WEB-INF em ordem alfabética, seguidos pela classpath especificado pelo arquivo de manifesto.

Se eu não colocar um arquivo de manifesto para a guerra em tudo, eu obter o material padrão seguido pelo conteúdo da WEB-INF / lib, mas em uma ordem arbitrária.

O que eu estou ausente? Existe uma maneira em que eu possa definir o caminho de classe para ser exatamente o que eu quero?

Dave

Foi útil?

Solução

Eu assumo pelo WebSphere, você quer dizer o regulares J2EE Application Server (e não algo como Community Edition; WebSphere é uma marca aplicada a uma série de produtos IBM)

.

Eu acho que suas opções são limitadas. Desde as dependências olhar muito explícito, eu preferiria uma abordagem programática em vez de depender dos caprichos do classpath (como a criação de instâncias de fábrica explicitamente em vez de depender do SPI).

Se isso não for uma opção, você pode querer olhar para fazer um de seus dependências um projeto EAR JAR utilidade e configure MÓDULO classloading com uma política PARENT_LAST classloading sobre a guerra. Isso pode ser configurado através do console de administração do navegador (ou através do RAD ferramentas se você usá-lo) .

Outra coisa que eu olhar é a ERA bibliotecas compartilhadas recurso (sob Ambiente no console de administração do navegador). Estes podem ser associada com servidores ou aplicações . A desvantagem é que este requer mais configuração.

Outras dicas

No IBM Websphere Application Server 6.1, os módulos da web têm seus próprios carregadores de classes que são normalmente utilizados no modo PARENT_FIRST. Isto significa que os carregadores de classe módulo web tentar delegar o carregamento de classe para os carregadores de classes pai, antes de carregar quaisquer novas classes.

Se você deseja ter as classes Xerces carregados antes da v2 parser XML (estou assumindo XML v2 analisador Oracle) aulas, então as classes Xerces terá que ser carregado por um carregador de classe pai - neste caso, de preferência o carregador de classe do aplicativo. Isso pode ser feito colocando o jar Xerces na raiz do arquivo EAR (se você tiver um) ou preparar o arquivo EAR com xerces.jar e seu arquivo WAR na raiz. O frasco xmlparserv2 deve então ser colocado em WEB-INF \ lib.

Você também pode tentar criar um Xerces biblioteca para uso compartilhado por sua aplicação.

Você pode encontrar mais informações sobre isso no IBM WebSphere Application Server V6.1: sistema de Gestão e Configuração . Os detalhes estão disponíveis no Capítulo 12.

Como JAXP Escolhe Analisadores

Você pode estar se perguntando qual analisador este programa realmente usa. JAXP, afinal, é razoavelmente independente do analisador. A resposta depende do que os analisadores são instalados no caminho de classe e como certas propriedades do sistema estão definidos. O padrão é usar a classe chamada pela propriedade do sistema javax.xml.parsers.DocumentBuilderFactory. Por exemplo, se você quiser ter certeza de que Xerces é usado para documentos de análise, então você seria executado JAXPChecker assim:

D:\books\XMLJAVA>java -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl  JAXPChecker file:///D:/books/xmljava/dom.xml
> file:///D:/books/xmljava/dom.xml is well-formed.

Se a propriedade javax.xml.parsers.DocumentBuilderFactory não está definido, então olha JAXP no arquivo lib / jaxp.properties propriedades no diretório JRE para determinar um valor padrão para a propriedade do sistema javax.xml.parsers.DocumentBuilderFactory. Se você quiser usar consistentemente um certo parser DOM, por exemplo gnu.xml.dom.JAXPFactory, coloque a seguinte linha no arquivo:

javax.xml.parsers.DocumentBuilderFactory=gnu.xml.dom.JAXPFactory

Se isto falhar para localizar um parser, próximos olhares JAXP para um arquivo META-INF/services/javax.xml.parsers.DocumentBuilderFactory em todos JAR arquivos disponíveis para o tempo de execução para encontrar o nome da subclasse concreta DocumentBuilderFactory.

Finalmente, se isso falhar, então DocumentBuilderFactory.newInstance() retorna uma classe padrão, geralmente o analisador do vendedor que também forneceu as classes JAXP. Por exemplo, as classes JDK JAXP escolher org.apache.crimson.jaxp.DocumentBuilderFactoryImpl por padrão, mas as classes Ælfred JAXP escolher gnu.xml.dom.JAXPFactory vez.

Você também pode tentar definir propriedade do sistema a preferir uma implementação. por exemplo. a preferir analisador dom xmlparserv2, conjunto javax.xml.parsers.DocumentBuilderFactory = oracle.xml.jaxp.JXDocumentBuilderFactory

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top