Troubleshooting maven war plugin failure com JSF Project

Olá Pessoal,

Hoje veremos um troubleshooting com maven. Se você já criou um projeto maven e depois adicionou funcionalidade do JSF ao projeto e ao realizar  mvn install teve a mensagem a seguir…

BUILD FAILURE

[INFO] ————————————————————————

[INFO] Total time: 2.321s

[INFO] Finished at: Sat Feb 02 16:34:52 BRST 2013

[INFO] Final Memory: 6M/15M

[INFO] ————————————————————————

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default-war)

 

…Certamente você ficou muito irritado. Na primeira vez eu não fiquei, mas  depois de um tempo sim. Bem, a questão é que ao adicionar as funcionalidade do JSF ao seu maven project,  a estrutura do seu projeto fica diferente do que é esperado por default pelo plugin do maven que gera o war.

O que ele espera: suapp\web-inf\web.xml

Mas o que é na realidade: \suapp\WebContent\WEB-INF\web.xml

Então, o que fazer?

Simples, adicione o plugin a seguir ao seu pom.xml

<plugin>

                    <groupId>org.apache.maven.plugins</groupId>

                    <artifactId>maven-war-plugin</artifactId>

                    <configuration>

                    <webXml>..\suapp\WebContent\WEB-INF\web.xml</webXml>

                    </configuration>

             </plugin>

 

O caminho do web.xml pode variar de acordo como está seu projeto, na dúvida clique com o botão direito no web.xml do projeto e vá na opção copy qualified name  e cole no bloco de notas e assim você obtém o caminho completo.

Bom, é isso ai. Vou ficando por aqui.

Abraços, see ya!! 

TroubleShooting: Fazendo deploy via Maven + JSF Project

 

 

Olá Pessoal,

O troubleshooting de hoje é um problema que descobri ao tentar usar Maven + JSF Project  +  qualquer Server APP. Você deve tá se perguntando: Como assim? Não entendi. Calma que vou explicar.

Lets go…

O problema

Se você criou projetos no Eclipse usando o Jboss tools e decidiu criar um projeto JSF Project  que temos no Jboss tools, vai ter um problema na hora que precisar fazer um quick start deplostart deploy usando algum plugin dos servidores de aplicação a seguir: jetty, jboss e tomcat. Mas, qual o problema?

Simples. Quando criamos um JSF Project todo o conteúdo para web vai ficar na pasta WebContent e ai que começa o problema, pois esta pasta não é padrão do maven e quando fazemos um deploy usando algum plugin dos app servers, simplesmente vamos ver que  suas páginas (.jsp, .xhtml etc) não serão copiadas junto com .war gerado pelo maven e ao acessar sua aplicação verá o error 404. E agora, como resolver?

A solução

Para resolver o problema não encontrei outra solução senão copiar tudo que tinha dentro de WebContent e colocar dentro de webapps, deixando assim:

 mavenwebapps

Execute o seguinte comando:

mvn eclipse:clean

Em seguida

 mvn eclipse:eclipse –Dwtpversion=2.0

No Eclipse, dê um refresh no projeto.

Clique com o botão direito no projeto e vá em properties e verique se está conforme a imagem a seguir. Caso tenha referência para WebContent, basta remover.

mavendeploymentassembly

Agora é só fazer o deploy com o seu servidor de preferência. Claro, é preciso ter o plugin do servidor adicionado ao pom.xml.

Vou ficando por aqui. Ah, há uma solução mais elegante, porém deixarei para o próximo post J

See ya!!

Abraços,

 

Troubleshooting: Maven HSQLDB Exception Hibernate 4

 

Olá pessoal,

O troubleshooting de hoje é bem simples, pelo menos nesse aqui não levei mais que 20 min para achar a solução. Migrando de Hibernate 3.x para  4.x  tive um problema com os testes que rodam com HSQLDB ao executar mvn test. Vamos ver o problema.

Lets go…

O problema

Ao executar os testes localmente fora do maven pelo Eclipse, funcionava normalmente, claro tinham as libs corretas no meu classpath, mas ao rodar pelo maven, os testes que usavam HSQLDB falhavam e com a seguinte exceção:

org.hibernate.exception.GenericJDBCException: This function is not supported

Caused by: java.sql.SQLException: This function is not supported

 

O motivo

A dependência para o HSQLDB deve ser:

<dependency>

<groupId>org.hsqldb</groupId>

<artifactId>hsqldb</artifactId>

<version>2.2.8</version>

</dependency>

 

Porém é comum declararmos:

<dependency>

<groupId>hsqldb</groupId>

<artifactId>hsqldb</artifactId>

<version>1.8.0.10</version>

</dependency>

 

Não use essa última, pois ela não dá suporte ao Hibernate 4. Não cheguei a testar se no Hibernate 3 há o mesmo problema.

Feita a alteração, rode mvn test e veja que seus testes passarão normalmente.

É isso ai, vivendo e aprendendo. Vou ficando por aqui…

Abraços, see ya!! 

Configurando o Jboss 7 no maven

 

Olá Pessoal,

O post de hoje vamos ver como configurar o JBoss AS 7 no maven sem precisar ter o Jboss Application Server instalado na máquina.

Lets go…

 

Starting…

 

1. Crie um maven project 

2. Escolha o tipo de projeto: jboss-javaee6-webappp

 

archetypejboss

3. Informe as configurações do seu projeto na próxima tela. 

4. O arquivo pom.xml vai ficar reclamando de algumas dependências. Apague todas as dependências de Hibernate, porque não vamos usar aqui.

 

5. Vá no pom e altere jboss-as-maven-plugin para versão 7.3.Final, ficando assim:

 

<plugin>

            <groupId>org.jboss.as.plugins</groupId>

            <artifactId>jboss-as-maven-plugin</artifactId>

            <version>7.3.Final</version>

         </plugin>

 

6. Run >> run configuration >> Maven

 jbossasrun

7. E clique em run

 

Aguarde o server subir e fazer o deploy da sua aplicação:

 consolejbossrun

Resultado:

runappjboss7

Pronto! já temos o jboss AS 7 rodando agora é só fazer dpeloy da app, e em segundos já temos aplicação no ar. Simples e fácil não? 

vou ficando por aqui e espero que tenham gostado do post. 

abracos, see ya!!! 

Maven + Jenkins + Git

Olá Pessoal, no post de hoje vamos ver como integrar maven + jenkis + git. É algo aparentemente simples, mas que na primeira vez me deu umas dores de cabeças chatas até deixar tudo redondo, e resolvi compartilhar com vocês.

Lets go…

O problema

Sempre temos que ter um problema para que o nosso dia fique mais emocionante. Então, eu tinha alguns:

1     Queria montar um ambiente automatizado com o jenkins ;

2      Queria conectar o jenkins com o git;

3      Queria fazer meu jenkins buildar pelo maven ;

4      Não ter um Java Project apenas;

5      Não queria ter mais de um repositório no Git, ou seja, nada de um repositório por projeto.

Bem, do problema 1-3 eu já tinha resolvido facilmente, mas o ponto 4-5 estava me incomodando, porque eu queria ter mais de um projeto para ter as coisas organizadas e melhor para trabalhar, sem falar que a manutenção fica mais fácil. Também há outro fator, eu sou preguiçoso para coisas repetitivas, odeio ter que fazer mais de uma vez o mesmo trabalho. Gosto de fazer o trabalho chato uma vez e se precisar mudar algo amanhã, que o esforço seja o mínimo possível.

A solução

Após  horas de tentativas de montar a estrutura ideal que queria, cheguei a uma que atendeu ao que precisava. Ou seja, atingi os 5 pontos citados anteriormente. Como? Simples assim:

  • Repositório: crie um repositório git, que aqui chamei de trunk
  • Parent: crie um maven Project chamado parent. Nele vou colocar as dependências base e comum nos projetos. Adicionei os outros projetos como module do projeto parent.
  • Filho 1: criei um Project maven chamado readers-core que será um projeto focado apenas no back-end da aplicação.
  • Filho 2 : criei um Project maven com suporte JSF que será focado na parte de front-end, porém esse projeto tem uma dependência do projeto filho 1 (readers-core).

Cada projeto tem seu próprio pom.xml, isso evita de ter um pom.xml com tudo e sabemos que quando a configuração de XML começa a crescer é um inferno pra ficar dando manutenção e se achar nele. Daí, cada projeto terá no seu pom.xml aquilo que ele precisa de fato, por exemplo, o projeto ereaders-core não precisa ter uma dependência  JSF definida no pom.xml, porque esse é um projeto que não foca em front-end.

A estrutura ficou assim

–meu repositório git

                –parent-project maven

                               –projeto Java A

                               –projeto Java  B

Na prática

Bem, não vou explicar como instalar o jenkins na máquina, nem o Git. Dúvidas? No blog tem posts relacionados, dá uma procurada nas devidas sessões.

Crie um reposito Git

O meu chamei de trunk.

Criando o projeto parent

Esse cara aqui é o mais importante, pois é pra ele que vamos apontar o Jenkins.  Portanto, crie um maven Project:

** Você vai precisar ter o Jboss Tools instalado Plugin instalado na sua IDE Eclipse.

No próximo passo


Observe que criei uma pasta chamada parent-project dentro de trunk. Faça isso.

No ultimo passo, deixe conforme a imagem a seguir:

Agora crie dois maven project, porém no segundo passo deixe assim:

** o package  você decide. Eu criei um .jar para o projeto core e .war para o projeto web.

No meu caso:

Abra o arquivo pom.xml do parent-project e adicione os dois outros projetos como modules:

Abra o pom.xml de um dos projetos que você criou, no meu caso ereaders-core. E em parent deixe assim:

Faça o mesmo para o outro projeto.

Para projetos Web

Se você criou um projeto web, terá que alterar seu pom.xml  conforme a seguir. No meu caso, crie um maven project e depois adicionei “capacidades de JSF”, isso porque o Jboss tools nos permite fazer isso.  Daí a estrutura do projeto fica assim.

Nós precisamos informar ao maven onde está o web.xml para que ele possa gerar o .war.

Para isso clique com o botão direito no pom.xml do projeto web e vá na opção maven >> add plugin. Na janela que aparece, informe o seguinte:

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-war-plugin</artifactId>

Feito isso, vá no modo de edição do pom.xml e adicione o código abaixo:

<configuration>

<webXml>..\readers-web\WebContent\WEB-INF\web.xml</webXml>

</configuration>

O código completo:

<plugin>

                    <groupId>org.apache.maven.plugins</groupId>

                    <artifactId>maven-war-plugin</artifactId>

                    <configuration>

                    <webXml>..\readers-web\WebContent\WEB-INF\web.xml</webXml>

                    </configuration>

             </plugin>

Caso contrario o seu build ia falhar, poruqe ele não ia saber o caminho do web.xml, por default o maven ia procurar em seuprojeto\ WEB-INF.

Alterando a versão do Java no maven

Se você estiver usando um projeto web com suporte servlet 3.0 é requerido Java 6, mas o maven por default usa Java 5. Para alterar basta adicionar o plugin no pom.xml do projeto web:

<groupId>org.apache.maven.plugins</groupId>

                    <artifactId>maven-compiler-plugin</artifactId>

                    <version>3.0</version>

E depois editar adicionando as informações a seguir:

<configuration>

                    <source>1.6</source>

                    <target>1.6</target>

                    </configuration>

Feito isso podemos buildar nosso projeto dentro do eclipse e ver o que acontece, portanto clique com o botão direito no parent-project, vá em Run As >> Maven Install

O resultado final deve ser conforme a imagem acima. Simples, não? Agora foi, mas antes disso tive problemas chatos. Um deles foi esse do .war.

No Jenkins

Agora vamos para o Jenkins e criar um job para buildar esse projeto

O meu chamei de parent-project e escolher a opção maven.

As configurações são bem simples, a mais chata foi a do build. Veremos a seguir.  Como estou usando o Git, então informei onde está o repositório:

E no build configurei:

Salve as alterações e clique em Build Now



E o resultado  é o build construído.

Bom, essa foi uma das soluções e que achei mais viável para o meu projeto. Espero que tenha gostado.

Compartilhe sua experiência… como tem feito?

Abraços, see ya!!