Rodando Jetty a partir do Maven

Olá Pessoal,

No post de hoje vamos ver como rodar o Jetty a partir do maven. Confesso que é a forma mais fácil e rápida. Já tentei de plugins no Eclipse etc, mas tem alguns plugins que dão muito trabalho, fora os bugs existentes.

Jetty no Maven

Para rodar o Jetty no maven é mais simples que tirar doce de criança. Caso não tenha nenhum projeto web com maven criado, siga os passos a seguir, caso contrário pule essa parte e veja só configuração do seu pom.xml e execute o maven.

Criando Projeto Maven Eclipse

File >> New >> Project

Maven  >> Maven Project

Clique em next e next

E na tela de Archetype escolha o projeto web, conforme a imagem a seguir:

A seguir o meu projeto:

Abra o arquivo pom.xml e vá na aba pom.xml.Dentro da tag build vamos adicionar o plugin para o Jetty e o maven vai se encarregar de fazer o restante:

<plugins>

<!– setup JETTY –>

<plugin>

<groupId>org.mortbay.jetty</groupId>

<artifactId>mavenjettyplugin</artifactId>

<version>6.1.26</version>

<configuration>

<!– uncomment this block if you want to change the default port jetty –>

<!– <connectors> <connector implementation=”org.mortbay.jetty.nio.SelectChannelConnector”>

<port>9090</port> </connector>

</connectors> –>

<!– force friendly name instead of artifact name + version –>              <contextPath>${project.build.finalName}</contextPath>

<!– You can save changes in a file or class and refresh your browser

to view the changes. –>

<scanIntervalSeconds>3</scanIntervalSeconds>

</configuration>

</plugin>

</plugins>

</build>

Feito isso, salve o arquivo e vamos rodar o jetty e ver  o resultado. Você pode rodar pelo Eclipse ou por fora via command line (eu gosto de rodar por fora).

Rodando pelo Eclipse

Clique com o botão direito no projeto >> Run As >> RunConfigurations

Escolha maven build e deixe conforme a tela a seguir:

Aqui não tem nada demais, apenas roda o comando mvn jetty:run e em base directory informamos o projeto que queremos.

Feito isso, o console do Eclipse deve estar assim:

Então podemos ver que o Jetty subiu normalmente.

Rodando via command line Windows

É bem simples. Abra o prompt do  Windows e vá até o diretório onde está o seu projeto. Ao chegar lá, execute o seguinte comando : mvn jetty:run  e veja que o Jetty será started. Na primeira vez que você fizer isso, o maven vai baixar os .jars  que são requeridos e deve demorar um pouco.

Testando aplicação

Para testar a aplicação é bem simples, com o Jetty rodando apenas digite no browser http://localhost:8080/   vai dar erro 404, não se preocupe, clique no link que está nessa página e certamente você vai ver a página index da sua aplicação, conforme a imagem a seguir:

Vou ficando por aqui!! Espero que tenham gostado do post.

See ya!! Abraços

Projeto JEE com jetty + maven

Olá Pessoal,

O post de hoje saiu após muito sofrimento de tentar criar um maven Project rodando com Jetty, mas que eu não precisasse ter o jetty na máquina local e que desse suporte JSF. Parece algo simples e fácil, concorda? Mas me deu uma dor de cabeça e consumiu praticamente 2 dias de tentativas. Vamos entender o motivo.

Lets go …

Contexto

Bem, eu precisava criar um projeto para ter tudo gerenciado pelo maven. Primeiro eu decidi sair do TomCat e ir para o Jetty, pois a performance do tomcat e outros problemas que estava tendo com o servidor estavam sendo criticos, mas eu não queria ter o jetty na máquina local para poder rodar minha app, queria fazer isso de maneira simples pelo maven, daí veio as alternativas:

  • Criar um projeto webapps usando o archetype do maven;
  • Criar um dynamic web Project e adicionar o maven ;
  • Criar um projeto maven usando archetype JSF disponíveis;
  • Criar um projeto JSF e depois adicionar maven + jetty
  • Plugin jetty Eclipse via Eclipse Market

Nenhuma dessas alternativas funcionou como eu queria. Muitos dos archetype disponíveis lá no maven estão “bugados” e simplesmente não iniciam aplicação. A opção 2 só funcionava sem JSF, ao adicionar “JSF capacibilities” pelo eclipse simplesmente exigia ter o jetty local para apontar. O mesmo para a opção 4. A opção 3 simplesmente nenhum dos archtype que tentei subia app. Tentei até arrumar, mas era muita mão e tempo que seria gasto. A opção 5 ainda está a desejar, os plugins que testei disponíveis no eclipse market simplesmente estavam cheio de bugs, fora quando não travava a IDE.

E a solução?

Mais simples do que imaginei. Apenas criei um simple maven Project.

 

 

Clique em next

 

Clique em finish. E terá um projeto com a estrutura a seguir:

 

Vamos criar nosso web.xml, WEB-INF e lib.

 

 

Para os arquivos web.xml e face-config.xml, é simples.  Apenas crie um JSF Project e copie o web.xml e face-config.xml gerado. Não recomendo querer criar os arquivos na mão, pois você pode ter erros por digitar algo errado e acabar perdendo tempo fixar algo que não agrega muito valor.

Adicione as libs que você precisa:

 

 

Novamente copiei do projeto jsf. E adicionei as do JSF 2.0 : jsf-api-2.0.9.jar e jsf-impl.jar

Agora vamos  configurar o arquivo  pom do maven:

Feito isso crie um arquivo index.jsp em webapp e dentro de body coloque o que achar necessário para testar.

 

 

Observe que criei um arquivo xhtml para poder testar o JSF 2.0.  Nele  apenas uso uma tag <h:outputLabel value=”Lopes Neto” /> assim verifico se realmente o projeto está dando suporte ao JSF.

Rodando aplicação

Para rodar aplicação é bem simples, clique com o botão direito no projeto e siga os passos a seguir:

 

Clique em maven build e vamos adicionar um build para iniciar o maven

<img mavenrunconfigjettyrun>

Apenas selecione o projeto em base directory e em goals coloque jetty:run que é para iniciar o servidor.

E agora basta acessar e ver sua aplicação rodando sem o jetty local, apenas através do maven:

Enfim, foi a forma que consegui fazer o maven rodar para projetos JEE com JSF sem ter o jetty local na máquina. Não posso dizer que fiquei satisfeito com essa solução, mas foi a que me deu menos dor de cabeça.

Vou ficando por aqui. See ya!!

Abraços!

ThroubleShooting: Resolvendo .OutputLabelRenderer.encodeEnd PrimeFaces

Olá Pessoal,

O throubleshooting de hoje, é algo muito bobo,mas chato que acontece ao usarmos o <p:outputLabel />do Primefaces. Se vc faz isso:

<p:outputLabel value=”Tipo da Conta” />

Simplesmente verá algo assim:

The error is the following:

java.lang.NullPointerException     at org.primefaces.component.outputlabel.OutputLabelRenderer.encodeEnd(OutputLabelRenderer.java:38)

Mas, por que isso acontece?

Simplesmente, pq esse componente requer  que o atributo for esteja associado a um id no input. E dai para resolver basta fazer isso:

<p:outputLabel for=”accountType” value=”Tipo da Conta” />

<h:inputText id=”accountType” value=”#{accountBean.account.type}”/>

Ou seja, nós temos um for para o id.

Simples assim. Não? Mas, muito chato de resolver. :).

abracos vou ficando por aqui.

See ya!!

ThroubleShooting:Adicionando AutoComplete XHTML PrimeFaces projeto Maven

Olá Pessoal,

No post de hoe veremos um troubleshooting  quando criamos um projeto Maven e precisamos do auto-complete  nos XHTML.

Lets go…

Starting…

Ao criar um projeto maven para uma aplicação web, por default ele não fornece o autocomplete para arquivo xhtml, e evidente que para componentes externos como PrimeFaces também não terá por default .

E como resolver?

A solução não é das melhores, mas é o que tem que ser feito, vamos ver os passos:

1. Se vc usar tomcat/jetty baixe a versão  no caso do exemplo estou usando Jetty 8.x

2. Garante que você tem o .jar do primefaces adicionar ao pom do projeto

3. clique com o botão direito no projeto >> configure >> add...

 

Na tela que abrir clique em next, observe o arquivo web.xml vai sofrer alteração, pois vamos adicionar suporte ao JSF.

Depois clique em Finish.

Se você não tem um servidor de aplicação configurado no seu eclipse, vá em Windows >> preferences >> Server >> Runtime Environment e adicione.

** Você deve apontar para a pasta onde tá o servidor instalado, no caso do jetty ele não é instalado, após descompactar o arquivo .zip, apenas aponta para a raiz da pasta descompactada. Assim o Eclipse encontrará o .jar que ele precisa.

Vou ficando por aqui, espero que tenham curtindo o post.

Abraços,  see ya!!

DBUnit com HSQLDB + Hibernate + maven

Olá pessoal!

No post de hoje vamos ver como executar nossos unit tests usando o DBunit com HSQLDB em memória, tendo o Hibernate como framework de persistencia e usando o maven. por que isso tudo? Eu passei por uns problemas chatos de configuração que normalmente não temos quando fazemos testes de cada um desses recursos separados, mas, quando tive que colocar tudo na mesma panela, surgiram uns problemas mais chatos para nós, desenvolvedores, estou falando daquelas exceções de não achar o arquivo, exceções genéricas dos frameworks, que nos faz ficar horas e horas googlando, etc.

lets go..

O que vou considerar?

Que você já conhece Hibernate e conhece o DBunit, porém agora pretende rodar seus testes em um projeto do tipo maven e que você tem dois arquivos hibernate.cfg.xml, um para os testes e outro para a aplicação em si.

O problema

Tudo começou quando, ao executar meus testes, simplesmente recebi aquela velha mensagem: cannot open JDBC Connection. Eu disse “como assim? O hibernate.cfg.xml está lá”. Daí comecei a investigar. Um ponto eu já sabia e publiquei aqui nesse troubleshooting: o maven procura o hibernate.cfg.xml em src/main/resources. E para os testes? Ele procura em src/test/resources. Até parece lógico, mas errei aqui e não coloquei meu arquivo de hibernate.cfg.xml de teste nesse local. Porém, veio outro problema: eu tinha renomeado meu arquivo hibernate.cfg.xml para hibernateTest.cfg.xml. Por que? Simplesmente queria ter essa diferença. E deixava assim a configuração nos meus testes:

 protected IDatabaseConnection getConnection() throws Exception {

conn = new DatabaseConnection(new Configuration().configure(“hibernateTest.cfg.xml”)

.buildSettings().getConnectionProvider().getConnection());

return conn;

}

Simplesmente recebia:


 

Dai o que fiz?

Mudei o arquivo para hibernate.cfg.xml e rodei a aplicação e o resultado:

 

Isso me custou umas 3hrs do meu dia. Infelizmente não fui pesquisar porque com o nome diferente do hibernate o maven não encontrava o arquivo, somente com o nome default.

O arquivo do DBunitTest é o mesmo que vimos nos outros post da série, a única diferença é que temos um projeto do tipo “simple maven project”.

Hibernate.cfg.xml para o HSQLDB

<session-factory>

<property name=”hibernate.connection.driver_class”>org.hsqldb.jdbcDriver</property>

<property name=”hibernate.connection.url”>jdbc:hsqldb:mem:db</property>

<property name=”hibernate.connection.username”>sa</property>

<property name=”hibernate.dialect”>org.hibernate.dialect.HSQLDialect</property>

<property name=”hibernate.show_sql”>true</property>

<property name=”hibernate.hbm2ddl.auto”>create-drop</property>

<mapping class=”com.camilolopes.qa.model.dao.bean.Account”/>

</session-factory>

 

Configuração do pom.xml Adicione as dependencias abaixo:

<dependency>

<groupId>hsqldb</groupId>

<artifactId>hsqldb</artifactId>

<version>1.8.0.10</version>

</dependency>

<dependency>

<groupId>javassist</groupId>

<artifactId>javassist</artifactId>

<version>3.12.1.GA</version>

<type>jar</type>

<scope>compile</scope>

</dependency>

<dependency>

<groupId>org.hibernate</groupId>

<artifactId>hibernate-core</artifactId>

<version>3.6.10.Final</version>

<type>jar</type>

<scope>compile</scope>

</dependency>

<dependency>

<groupId>org.dbunit</groupId>

<artifactId>dbunit</artifactId>

<version>2.4.8</version>

<type>jar</type>

<scope>compile</scope>

</dependency>

 

Crie um bean e um teste para persistir o objeto:

Bean

@Entity

@Table(name=”account”)

public class Account {

@Id

@GeneratedValue

@Column(name=”ID”)

private Long id;

@Column(length=20,name=”TYPE”)

private String type;

}

Test

A classe de test deverá estar assim, e omitir o que não mudou do outro arquivo, como a conexão e o load do .xml.

public DBUnitTest() {

try {

session = getSessionFactory().openSession();

getDataSet();

} catch (Exception e) {

e.getMessage();

}

}

public static SessionFactory getSessionFactory() {

sessionFactory = new Configuration().configure().buildSessionFactory();

return sessionFactory;

}

@Test

public void testSave(){

session.beginTransaction();

Account account = new Account();

account.setType(“USER”);

session.save(account);

}

Enfim, é isso ai. Caso precise rodar seus unit tests com maven + hibernate + hsqldb, sem ter dor de cabeça com arquivo de configuração, essa foi a solução que encontrei.

Abracos, see ya!!