Lucas Teixeira

@lucastex

Como fazer o deploy de uma app grails no JBoss

com 5 comentários

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.

Postado por Lucas Teixeira

February 14th, 2010 at 10:51 am

Postado em Grails

Com as tags , , , , , ,

5 Respostas a 'Como fazer o deploy de uma app grails no JBoss'

Receber novos comentários por RSS or TrackBack to 'Como fazer o deploy de uma app grails no JBoss'.

  1. 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

  2. [...] 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 [...]

  3. interessante : fazendo deploy de uma app grails no jboss – http://tinyurl.com/yz5hk7h #valeu_lucas#

    Pedro Herrera

    19 Feb 10 at 23:49

  4. 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

  5. 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

Deixe um comentário

Get Adobe Flash playerPlugin by wpburn.com wordpress themes