CONFIGURANDO A EXCLUSÃO DO USO DE MÓDULOS PADRÃO NO JBOSS 7
Autor: josepojr | Publicado: 2015-11-17T22:54:00-02:00













INTRODUÇÃO

&nbsp; 

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:


https://hc.apache.org/


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:



&lt;?xml
version="1.0" encoding="UTF-8"?&gt;







&lt;jboss-deployment-structure
xmlns="urn:jboss:deployment-structure:1.1"&gt;


  
&lt;ear-subdeployments-isolated&gt;true&lt;/ear-subdeployments-isolated&gt;


   &lt;deployment&gt;


  &lt;exclusions&gt;


   &lt;module
name="org.apache.httpcomponents" slot="main" /&gt;


  &lt;/exclusions&gt;


       
&lt;dependencies&gt;


   &lt;module
name="javax.api"/&gt;


   &lt;module
name="org.jboss.resteasy.resteasy-jaxrs"/&gt;


   &lt;module
name="org.infinispan"/&gt;


   &lt;module
name="deployment.MeuProjeto.ear.MeuEJB.jar"/&gt;


   &lt;module
name="deployment.MeuProjeto.ear.MeuWAR.war"/&gt; 


       
&lt;/dependencies&gt;        



   &lt;/deployment&gt;


   



      &lt;!--
durante o deploy. --&gt;


   &lt;sub-deployment
name="MeuEJB.jar"&gt;


  &lt;exclusions&gt;


   &lt;module
name="org.apache.httpcomponents" slot="main" /&gt;


  &lt;/exclusions&gt;  


  


  &lt;local-last
value="true"/&gt;


   &lt;/sub-deployment&gt;


   



   &lt;sub-deployment
name="MeuWAR.war"&gt;


  &lt;dependencies&gt;


   &lt;module
name="deployment.MeuProjeto.ear.MeuEJB.jar"/&gt;


  &lt;/dependencies&gt;


  


  &lt;local-last
value="true"/&gt;   



   &lt;/sub-deployment&gt;


   



&lt;/jboss-deployment-structure&gt;






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 &lt;deployment&gt;.


Na pasta /lib
dentro do projeto EAR (ou conhecida como EAR/lib) devem estar os jars
do Apache Http Client obtido no site:

https://hc.apache.org/downloads.cgi







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





http://www.josepojr.com/2013/10/ordem-de-carregamento-de-classes-jars.html

http://www.josepojr.com/2013/01/isolamento-de-classloaders-no-jboss-as-7.html

https://hc.apache.org/

https://hc.apache.org/downloads.cgi

https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7

https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/6/html/Development_Guide/Add_an_Explicit_Module_Dependency_to_a_Deployment1.html

https://developer.jboss.org/thread/202130

http://www.oracle.com/technetwork/pt/java/javase/downloads/jdk8-downloads-2133151.html

http://wildfly.org/downloads/