terça-feira, 17 de novembro de 2015

CONFIGURANDO A EXCLUSÃO DO USO DE MÓDULOS PADRÃO NO JBOSS 7



INTRODUÇÃO
 
Nos artigos anteriores (http://www.josepojr.com/2013/10/ordem-de-carregamento-de-classes-jars.html e http://www.josepojr.com/2013/01/isolamento-de-classloaders-no-jboss-as-7.html) foi mostrada a configuração do jboss 7 no arquivo jboss-deployment-structure.xml e algumas regras de preferência no carregamento de dependências. Nesse artigo, vamos mostrar como evitar que um módulo padrão que já vem instalado dentro do JBoss 7 (pasta $JBOSS_HOME/modules) seja carregado. E consequentemente, podemos usar os nossos arquivos .jar sem problemas de dependências e lançamentos de exceções do tipo NoSuchMethodException (método não existente). Esse tipo de exceção pode ocorrer se em tempo de projeto (usando uma IDE por exemplo), usamos os jars de uma biblioteca como por exemplo Apache Http Client na versão 4.5, mas no JBoss 7, já temos por exemplo, uma versão dessa mesma biblioteca na versão 4.2, por exemplo. E ao invocar métodos que só existam na versão 4.5, mas na versão 4.2, os mesmos não existe, o erro NoSuchMethodException pode aparecer. Isso porque em tempo de compilação foi usada a versão 4.5, mas em tempo de execução (projeto war ou ear implantado dentro do JBoss 7), a versão 4.2 (dentro da pasta $JBOSS_HOME/modules) pode ser carregada primeiro em detrimento a versão 4.5 (que pode ou não estar na pasta EAR/lib).
Por isso, precisamos configurar o arquivo .ear gerado para que não ocorra esses erros de dependências que será mostrado nesse artigo.


DESENVOLVIMENTO

Como por exemplo, vamos usar a biblioteca Apache Http Client que pode ser baixada do site:
Esses componentes permite qualquer programa acessar servidores web no protocolo HTTP ou HTTPS. Para isso, fornece modelos para a construção de clientes HTTP no seu programa Java. Sem esses componentes, teríamos que escrever do “zero” (projeto desde o início, novo) um cliente HTTP dentro do nosso programa Java. Isso é possível usando as classes java.net.Socket, java.io.InputStream, java.io.OutputStream e outras semelhantes dentro do JRE (Java Runtime, ambiente de execução do Java mais a máquina virtual) fornecido em toda instalação Java em qualquer dispositivo.
Mas, teríamos que perder um tempo enorme para fazer todas essas chamadas, sendo que com o uso desses componentes e com poucas linhas de códigos já temos um cliente HTTP para usarmos no nosso código.
Portanto, como esse projeto é tem uma licença bem semelhante a um software Open Source e é usado em diversos projetos, o JBoss 7 já vem com essa biblioteca da Apache já configurada como módulo dentro do servidor JBoss 7.
Ao mesmo tempo em que isso é bom, pois já temos um módulo dessa biblioteca para usarmos em nosso projeto, ao mesmo tempo também é ruim, pois queremos usar uma versão mais recente da biblioteca em nossos projetos, por exemplo.
Para isso, vamos configurar o arquivo jboss-deployment-structure.xml para não usar o Apache Http Client existente como módulo dentro do JBoss:

<?xml version="1.0" encoding="UTF-8"?>

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
<ear-subdeployments-isolated>true</ear-subdeployments-isolated>
<deployment>
<exclusions>
<module name="org.apache.httpcomponents" slot="main" />
</exclusions>
<dependencies>
<module name="javax.api"/>
<module name="org.jboss.resteasy.resteasy-jaxrs"/>
<module name="org.infinispan"/>
<module name="deployment.MeuProjeto.ear.MeuEJB.jar"/>
<module name="deployment.MeuProjeto.ear.MeuWAR.war"/>
</dependencies>
</deployment>
<!-- durante o deploy. -->
<sub-deployment name="MeuEJB.jar">
<exclusions>
<module name="org.apache.httpcomponents" slot="main" />
</exclusions>
<local-last value="true"/>
</sub-deployment>
<sub-deployment name="MeuWAR.war">
<dependencies>
<module name="deployment.MeuProjeto.ear.MeuEJB.jar"/>
</dependencies>
<local-last value="true"/>
</sub-deployment>
</jboss-deployment-structure>


Só colocar os trechos marcados em VERMELHO no arquivo jboss-deployment-structure.xml do seu projeto. Nesse exemplo, estamos dizendo que o projeto EJB chamado “MeuEJB.jar” precisa usar a biblioteca Apache Http Client própria e não do JBoss 7. E também, estamos excluindo o uso no ear como um todo como mostra o trecho em VERMELHO dentro da tag <deployment>.
Na pasta /lib dentro do projeto EAR (ou conhecida como EAR/lib) devem estar os jars do Apache Http Client obtido no site:


CONCLUSÃO

Mostramos que o uso de configurações dentro do arquivo jboss-deployment-structure.xml permite refinar algumas configurações que terão impacto tanto no tempo de implantação (deploy) ou em tempo de execução, quando a aplicação for chamada pela primeira vez.
Com isso, podemos usar as versões mais recentes das bibliotecas de terceiros sem conflitar com as mesmas bibliotecas de outras versões já instaladas dentro do JBoss 7.


REFERÊNCIAS











Nenhum comentário:

Postar um comentário