Como fazer o deploy de uma app grails no JBoss
Neste fim de semana quis fazer alguns testes pela primeira vez com uma aplicação grails no jboss.
Já tinha acompanhado na grails-users que existem alguns problemas para efetuar o deploy, e para cada um deles, uma sequência de passos obscuros para fazer o deploy acontecer com sucesso. Minha versão de grails neste procedimento é a 1.2.1 e do JBoss é a 5.1.0.GA
Efetivamente, o que acontece é que jboss traz junto com suas common libs vários jars que são empacotados juntamente com a sua aplicação quando você utiliza o comando grails war.
Existem alguns workarounds na internet que te mostram como modificar o BuildConfig.groovy (arquivo que define propriedades do empacotamento de sua app) para que após montar a estrutura de arquivos que irão ser empacotados, remova estes arquivos (principalmente o log4j onde o problema é mais aparente) do chamado stagingDir e os deixe de fora do pacote final.
Particularmente, achei a solução um tanto quanto diferente e acabei achando no FAQ do Grails e depois com mais detalhes nesta página uma solução menos intrusiva ao pacote, que é definir a prioridade de carregamento dos jars da aplicação.
Bom, para isso, precisamos criar um arquivo jboss-web.xml dentro do diretório WEB-INF de nossa aplicação que irá mostrar ao jboss que queremos “blindar” nossa aplicação para utilizar os jars que estão dentro de seu lib, e que estes por sua vez não deverão ser sobrescritos pelos jars do classpath do servidor. O conteúdo do arquivo segue abaixo:
<jboss-web>
<context-root>/projeto</context-root>
<class-loading java2ClassLoadingCompliance="false">
<loader-repository>
projeto:archive=projeto.war
<loader-repository-config>java2ParentDelegation=false</loader-repository-config>
</loader-repository>
</class-loading>
</jboss-web>
Na tag context-root estamos apenas aproveitando que a aplicação terá seu arquivo de configuração específico para o jboss e definindo o contexto em que ela será publicada. Nas tags seguintes pedimos para o jboss criar o nosso classloader isolado, com o nome “projeto:archive=projeto.war”. Com este nome (que deve ser único, por isto leva em consideração o nome do projeto), garantimos que as classes pedidas pelo nosso projeto serão procuradas ali, e caso não encontradas, nos classpaths seguintes (common/lib, depois no tomcat).
Basicamente isto seria suficiente para conseguir que o projeto rodasse sem problemas. Porém no meu cenário de versões (grails 1.2.1 e jboss-5.1.0.GA) existe outro ponto de conflito. O Hibernate Validator que está junto ao jboss também difere em versão e gera conflito com o grails. Neste caso a solução é ainda mais interessante e simples que a anterior.
Para resolver o problema no deploy que indica claramente problema de versão no Hibernate Validator, basta que você faça o download da última versão deste jar (no meu caso, 4.0.2-GA) nesta url: https://www.hibernate.org/30.html. Depois disto, resta apenas colocar o jar do hibernate validator dentro da pasta <jboss_home>/common/lib.
Pronto, a aplicação está rodando e funcional dentro do jboss!
10:36:32,815 INFO [[/projeto]] Initializing Spring root WebApplicationContext 10:36:41,155 INFO [[/projeto]] Initializing Spring FrameworkServlet 'grails'
PS: Vale lembrar que o arquivo jboss-web.xml é padrão para arquivos war, se você quiser configurar a ordem do classpath para aplicações ear ou sar, consulte o link acima para entender as diferenças.
Problemas ao rodar aplicações em #grails no #jboss? Veja o procedimento de configuração do classpath do jboss aqui: http://bit.ly/9eKyos
Lucas Teixeira
14 Feb 10 at 10:53
[...] comentários Ok, agora que temos uma aplicação grails rodando no ambiente jboss, temos que configurar um DataSource JNDI para ser usado, com isso evitamos que as credenciais e [...]
Criando um DataSource JNDI no JBoss at Lucas Teixeira
15 Feb 10 at 00:08
interessante : fazendo deploy de uma app grails no jboss – http://tinyurl.com/yz5hk7h #valeu_lucas#
Pedro Herrera
19 Feb 10 at 23:49
Lucas quero parabenizar o blog que está muito bom. Trabalhei com Grails tem um tempo, acabei por acaso voltando a trabalhar com ele, mas acontece que na primeira vez fazia deploy em cima de servidores com Tomcat (molezinha), agora testei a sua dica em servidor com JBoss 4, JBoss 5 que funcionaram perfeitamente. Quando fui testar no JBoss 6 ele não fez o deploy sendo que era a mesma aplicação que rodou nas duas versões anteriores do JBoss. O erro que apresenta é esse: Unexpected error during load of:groovy.jmx.builder.package-info ! Por acaso já viu este erro? Obrigado Lucas e Abraços!
Martin
19 Oct 10 at 14:59
Oi Martin,
Infelizmente, não presenciei essa mensagem. Como você fez o deploy a mais tempo, pode ser também alguma diferença da versão mais atual do Grails e não do container. Vale a pena validar este pacote em um JBoss mais antigo ou a versão mais antiga do Grails neste JBoss mais recente.
Assim, já dá um cheiro pra saber por onde começar a investigar… A versão que rodei no JBoss 6 do Grails foi no branch 1.2.x.
Valeu!
Lucas Teixeira
19 Oct 10 at 21:11