Usando JSF2 e JPA2 com Jetty

Trabalhar com java para web muitas vezes é um exercício de paciência enorme, principalmente para fazer alguma coisa bem simples. Você pode gastar muito tempo para configurar direito o maven (praticamente nunca trabalhei em projeto que usasse maven ou ant), isso quando não se perde mais de um dia pra isso. Outro detalhe é o servidor de aplicação (jboss por exemplo) que entre vários restarts para fazer deploy toma muito tempo, por que até hoje não vi nenhum desses servidores de aplicação java que, mesmo com hot-deploy habilitado não dê um PermGem exception depois de seguidos re-deploys.

Resolvi tentar o jetty, que me parecia bem rápido e é utilizado de forma embarcada, em aplicativo como o Solr, que tem uma boa performance.

O Jetty é um servidor web feito em java muito leve. Apesar de ser um container servlet podemos estendê-lo para também ser um container EJB, por exemplo. Ele não vem com toda a stack do JEE, mas pesquisando um pouquinho na internet, consegui criar um pom.xml que permite usar JSF 2 (primefaces) e JPA 2 (Ebean, mas dá para usar o hibernate, simplesmente adicionando no pom as dependências).

A principal vantagem do jetty é a rapidez do deploy já que no boot ele não tem tanta coisa pedurada como o Jboss, que leva quase 8 segundos bootando na minha máquina.

Abaixo listo o pom.xml para um projeto baseado no Jetty, JSF e JPA:

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>sh.app.sample-projects</groupId>
<artifactId>jsf2-jetty-maven</artifactId>
<version>SNAPSHOT</version>
<name>JSF 2, JPA 2, Jetty and Maven together</name>

<dependencies>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>${com.sun.faces.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>${com.sun.faces.version}</version>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>commons-fileupload</groupId>
<artifactId> commons-fileupload</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId> commons-io</artifactId>
<version>2.1</version>
</dependency>

<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.7.2</version>
</dependency>

<dependency>
<groupId>org.avaje</groupId>
<artifactId>ebean-spring</artifactId>
<version>2.7.7</version>
</dependency>

<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901.jdbc4</version>
</dependency>
    
     <!-- primefaces -->
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>3.4.2</version>
</dependency>

<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.2.8</version>
<scope>compile</scope>
</dependency>

<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.0.0.GA</version>
<scope>compile</scope>
</dependency>

<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>

<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>

<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>

<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2</version>
</dependency>

<dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.1</version>
</dependency>

<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>

  <!-- SQLite database JDBC -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.6.0</version>
</dependency>

</dependencies>


<repositories>
<repository>
<id>prime-repo</id>
<name>PrimeFaces Maven Repository</name>
<url>http://repository.primefaces.org</url>
<layout>default</layout>
</repository>
<repository>
<id>JBoss repository</id>
<url>http://repository.jboss.com/maven2/</url>
</repository>
</repositories>

<build>
<finalName>contactlist</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.source.level}</source>
<target>${java.source.level}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${jetty-maven-plugin.version}</version>
<configuration>
    <webApp>
     <contextPath>/contactlist</contextPath>
   </webApp>
   </configuration>
</plugin>
      
     <!-- Tomcat plugin for embedded tomcat -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<configuration>
<path>/contactlist</path>
</configuration>
</plugin>

</plugins>
</build>

<properties>
<encoding>UTF-8</encoding>

<java.source.level>1.6</java.source.level>
<spring.version>3.1.3.RELEASE</spring.version>
<com.sun.faces.version>2.1.7</com.sun.faces.version>
<jetty-maven-plugin.version>8.1.2.v20120308</jetty-maven-plugin.version>
<org.slf4j.version>1.6.5</org.slf4j.version>
<junit.version>4.10</junit.version>
</properties>

</project>

Um exemplo de projeto pode ser encontrado aqui

Para rodar entre no diretório do projeto e digite:

mvn jetty:run

e depois acessar a url:

http://localhost:8080/contactlist/list.jsf
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: