jueves, 15 de abril de 2010

Maven2 y EJB 3.0 en 5 minutos

Creación de una aplicación EJB 3.0 simple usando EJB

Para este tutorial estoy usando Ubuntu 9.10, JDK1.6, Maven2(version 2.2.1),JBOSS-4.2.3.GA y un editor de texto(gedit)
Como requisito para este tutorial es que se tenga instalado Maven2, con sus respectivas variables de entorno
Vamos a crear un parent application que sera el padre de los modulos de EJB y WEB


Los archetypes de Maven para generar el proyecto y los modulos:
Como primer paso creemeos la aplicación parent, para esto vamos a abrir una consola de comandos y vamos a colocar el siguiente comando
mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=com.xtreme -DartifactId=ejemploEJBPadre -DpackageName= -Dversion=1.0

Como segundo paso debemos entrar dentro del directorio ejemploEJBPadre y creamos un directorio llamado modulos, luego entramos en el directorio módulos y ejecutamos el comando para la creacion del modulo de EJB
mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=ejemploEJB -DartifactId=moduloEJB -DpackageName=com.xtreme.demo.ejb -Dversion=1.0

Luego, dentro del directorio ejemploEJBPadre, debemos ejecutar el siguiente comando:
mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=ejemploEJB -DartifactId=moduloWEB -DpackageName=com.extreme.demo.web -Dversion=1.0

Con esto tenemos creados el proyecto padre y los módulos EJB y WEB
La generación del pom.xml, nos resulta insuficiente para nuestro proyecto, por eso debemos modificar los archivos pom.xml
1) para ejemploEJBPadre/pom.xml

<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>com.xtreme</groupId>
<artifactId>ejemploEJBPadre</artifactId>
<packaging>pom</packaging>
<version>1.0</version>
<name>ejemploEJBPadre</name>
<description>Esta es el padre de todos los modulos</description>
<url>http://maven.apache.org</url>
<!--Modulos a compilar-->
<modules>
<module>modulos/moduloEJB</module>
<module>modulos/moduloWEB</module>
</modules>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--Llamada a repositorio de JBOSS, para modulos de anotaciones y otros que no pueden estar disponibles--> <repositories>
<repository>
<id>jboss-repository</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.com/maven2</url>
<layout>default</layout>
</repository>
</repositories>
<!--Versión de JDK en la cual se compilaran los fuentes, para este caso 1.5-->
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

2) para ejemploEJBPadre/moduloEJB/pom.xml

<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>
<!--Definición del Padre-->
<parent>
<groupId>com.xtreme</groupId>
<artifactId>ejemploEJBPadre</artifactId>
<version>1.0</version>
</parent>

<groupId>ejemploEJB</groupId>
<artifactId>moduloEJB</artifactId>
<packaging>jar</packaging>
<version>1.0</version>
<name>moduloEJB</name>
<description>Archivo de definición para modulo EJB</description>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>jboss</groupId>
<artifactId>jboss-ejb-api</artifactId>
<version>4.2.0.GA</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

3) para ejemploEJBPadre/moduloWEB/pom.xml

<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>
<!--Definición del Padre-->
<parent>
<groupId>com.xtreme</groupId>
<artifactId>ejemploEJBPadre</artifactId>
<version>1.0</version>
</parent>


<groupId>ejemploEJB</groupId>
<artifactId>moduloWEB</artifactId>
<packaging>war</packaging>
<version>1.0</version>
<name>moduloWEB Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>

<!-- Dependencia de ejb creado-->
<dependency>
<groupId>ejemploEJB</groupId>
<artifactId>moduloEJB</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
<!-- Dependencias Externas-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>jboss</groupId>
<artifactId>jboss-ejb-api</artifactId>
<version>4.2.0.GA</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>moduloWEB</finalName>
</build>
</project>


Creación de Clases e Interfaces:

Una vez hecho esto debemos entrar al directorio ejemploEJBPadre/moduloEJB/src/main/java/com/xtreme/demo/ejb y empezar a escribir las interfaces locales y remotas para los respectivos beanes. Para mi caso tengo los siguientes archivos
- MensajeBean.java
- MensajeInterfaceLocal.java
- MensajeInterfaceRemoto.java


Su código es el siguiente:

Para MensajeInterfaceLocal.java

package com.xtreme.demo.ejb;
import javax.ejb.Local;
@Local
public interface MensajeInterfaceLocal{
public void saludar();
public double sumar(double valor1, double valor2);
}

Para MensajeInterfaceRemoto.java

package com.xtreme.demo.ejb;
import javax.ejb.Remote;

@Remote
public interface MensajeInterfaceRemoto extends MensajeInterfaceLocal{
}

Para MensajeBean.java
package com.xtreme.demo.ejb;
import javax.ejb.Stateless;
@Stateless
public class MensajeBean implements MensajeInterfaceLocal,MensajeInterfaceRemoto{
public void saludar(){
System.out.println("Este es un ejemplo de EJB Stateless");
}

public double sumar(double valor1, double valor2){
return valor1+valor2;
}
}

Creación de Servlet:

Luego tenemos que programar un Servlet que nos permita usar este componente.
Para esto entramos a: ejemploEJBPadre/moduloWEB/src/main/java/com/xtreme/demo/web
y en ese directorio creamos el archivo VerMensajeServlet.java
que tiene el siguiente código:
package com.xtreme.demo.ejb.web;
import java.io.IOException;
import java.io.PrintWriter;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.xtreme.demo.ejb.MensajeInterfaceLocal;


public class VerMensajeServlet extends HttpServlet{
private static final long serialVersionUID = 3031665322987189909L;
private MensajeInterfaceLocal mensaje=null;
public VerMensajeServlet(){
final Context context;
try{
context=new InitialContext();
mensaje=(MensajeInterfaceLocal)context.lookup("MensajeBean/local");
}catch(NamingException ex){
ex.printStackTrace();
}

}
public void doGet(HttpServletRequest request, HttpServletResponse response){
processRequest(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response){
processRequest(request,response);
}
public void processRequest(HttpServletRequest request, HttpServletResponse response){
try{
final PrintWriter out = response.getWriter();
mensaje.saludar();
out.println("El resultado de la suma:"+mensaje.sumar(2,3));
}catch(Exception ex){
ex.printStackTrace();
}
}
}

Luego modificamos web.xml que se encuentra dentro de: ejemploEJBPadre/moduloWEB/src/main/webapp/WEB-INF
El código es el siguiente:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
<display-name>Archetype Created Web Application</display-name>

<servlet>
<description></description>
<display-name>VerMensajeServlet</display-name>
<servlet-name>VerMensajeServlet</servlet-name>
<servlet-class>com.xtreme.demo.ejb.web.VerMensajeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>VerMensajeServlet</servlet-name>
<url-pattern>/VerMensajeServlet</url-pattern>
</servlet-mapping>
</web-app>

Una vez hecho esto, vamos a ejemploEJBPadre/ y ejecutamos el comando mvn clean install, para generar el archivo jar, correspondiente al ejb y el war del aplicativo web, además de actualizar el repositorio con nuevas librerias.
Cuando se haya acabado de generar estos archivos entremos a: ejemploEJBPadre/modulos/moduloWEB/target y copiemos moduloWEB.war a <JBOSS_HOME>/server/default/deploy. También copiemos moduloEJB-1.0.jar de ejemploEJBPadre/modulos/moduloEJB/target a <JBOSS_HOME>/server/default/deploy
Luego de esto, levantamos nuestro servidor JBOSS y entremos a: http://localhost:8080/moduloWEB/VerMensajeServlet

Con esto demos poder ver "El resultado de la suma:5.0" y en el log de JBOSS veremos "Este es un ejemplo de EJB Stateless"

No hay comentarios:

Publicar un comentario