Version 2

    Na plataforma Java em quase todos os  projetos podemos encontrar bibliotecas de alguns frameworks como Spring, JSF, Struts, Hibernate e etc. Isso faz com que as aplicações se tornem gigantes,  50 MB, 100 MB. Eu já encontrei aplicações com mais de 200 MB.

     

    Isso se deve ao fato de que existe uma "cultura" e displicência na adição de bibliotecas no WEB-INF/lib. Em versões anteriores no JBoss poderíamos utilizar o diretório lib do profile ou common para armazenar as libs. No JBoss AS 7 a melhor maneira de deixar bibliotecas disponíveis para a aplicação,  é a criação de  módulo que armazene essas bibliotecas.

     

    Recentementeconversei conversei com um colega sobre um problema em um projeto que utilizava Struts. Ele desejava remover as libs da aplicação e deixar tudo isso no JBoss na forma de um módulo.  Como eu nao entendo quase nada de Struts decidi não perder tempo e pegar uma aplicação ou tutorial da Web pronto:

     

    http://www.mkyong.com/struts/struts-hello-world-example/

     

    O projeto acima utiliza Struts 1.3.10 e foi um bom case de testes e aprendizado. A aplicação original está aqui. Ela possui 1,5 MB é bem pequena mas já dá para testar. Quando realizamos o building com o maven as seguintes bibliotecas são baixadas e adicionadas no WEB-INF/lib da aplicação.

     

    antlr-2.7.2.jar
    commons-beanutils-1.8.0.jar
    commons-chain-1.2.jar
    commons-digester-1.8.jar
    commons-logging-1.0.4.jar
    commons-validator-1.3.1.jar
    oro-2.0.8.jar
    struts-core-1.3.10.jar
    struts-taglib-1.3.10.jar

     

     

    O objetivo é colocar isso como um módulo do JBoss AS 7.

     

    Inicialmente crie a estrutura de diretório JBOSS_HOME\modules\com\company\project\main.

     

    Adicione todas as bibliotecas que estão no diretório WEB-INF/lib da aplicação de exemplo StrutsExample.war no diretório JBOSS_HOME\modules\com\company\project\main.


    Crei o arquivo module.xml no mesmo diretório onde estão as libs JBOSS_HOME\modules\com\company\project\main e adicione o conteúdo abaixo:

     

     

    <module xmlns="urn:jboss:module:1.1" name="com.company.project">
    <resources>
       <resource-root path="antlr-2.7.2.jar"/>
       <resource-root path="commons-beanutils-1.8.0.jar"/>
       <resource-root path="commons-chain-1.2.jar"/>
       <resource-root path="commons-digester-1.8.jar"/>
       <resource-root path="commons-logging-1.0.4.jar"/>
       <resource-root path="commons-validator-1.3.1.jar"/>
       <resource-root path="oro-2.0.8.jar"/>
       <resource-root path="struts-core-1.3.10.jar"/>
       <resource-root path="struts-taglib-1.3.10.jar"/>
    </resources>
    
    <dependencies>
       <module name="sun.jdk"/>
       <module name="javax.api"/>
       <module name="javax.servlet.api"/>
       <module name="javax.servlet.jsp.api"/>
    </dependencies>
    </module>
    

     

    Já adicionamos as nossas bibliotecas e declaramos as dependências.

     

    O próximo passo é configurar o arquivo jboss-deployment-structure.xml no WEB-INF da aplicação fazendo referência ao módulo configurado:

     

    <jboss-deployment-structure>
      <deployment>
         <exclusions>
            <module name="org.apache.log4j" />
         </exclusions>
         <dependencies>
            <module name="com.company.project"/>
         </dependencies>
      </deployment>
    </jboss-deployment-structure>
    

     

    Essa configuração "diz" ao JBoss que a aplicação depende do módulo com.company.project e consequentemente de suas bibliotecas.

     

    Eu tive alguns pequenos problemas com as bibliotecas do Struts que não estão ligadas com a configuração do módulo.

     

    Esse projeto ficou lançando a seguinte exception: uri: http://struts.apache.org/tags-bean cannot be resolved in either web.xml or the jar files deployed with this application

     

    A solução está nesse link: http://www.mkyong.com/struts/the-absolute-uri-httpstruts-apache-orgtags-bean-cannot-be-resolved-in-either-web-xml-or-the-jar-files-deployed-with-this-application/

     

    O objetivo foi alcançado. Agora a aplicação ficou com 12,7 KB.

     

    O tema abordado nesse artigo não serve apenas para aplicações Struts mas sim para todas as  aplicações em que seja necessário criação de módulos personalizados.

     

    Ps: Já existe um módulo commons no JBoss que poderia ser utilizado como "dependencies".

     

    Abraçoso