Ingredientes: Eclipse, Jetty y un proyecto J2EE descrito con Maven

Esta semana ha surgido en Opina la necesidad de definir un entorno de desarrollo en el que en lugar de Apache Tomcat se necesitaba trabajar con Jetty 6.x. Nunca había trabajo con Jetty, sin embargo, mis compañeros de trabajo todos lo usaban y las primeras impresiones son muy buenas.

El objetivo del presente post es, teniendo nuestro proyecto J2EE descrito con Maven y configurado en Eclipse, trabajar con Jetty. En este caso el proyecto será Opina e intentaremos usar Jetty en lugar de Apache Tomcat durante el desarrollo.

En primer lugar tendremos que configurar el plugin de maven correspondiente. Para ello, en la sección correspondiente a build (dentro de pom.xml):

<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.5</version>
<configuration>
<scanIntervalSeconds>5</scanIntervalSeconds>
<scanTargets>
<scanTarget>
${basedir}/src/main/webapp/WEB-INF
</scanTarget>
</scanTargets>
<classesDirectory>
${basedir}/src/main/webapp/WEB-INF
</classesDirectory>
<contextPath>${project.artifactId}</contextPath>
<webAppSourceDirectory>
${basedir}/src/main/webapp
</webAppSourceDirectory>
<webXml>
${basedir}/src/main/webapp/WEB-INF/web.xml
</webXml>
</configuration>
</plugin>

Esta configuración está condicionada a que en Opina usarmos ${basedir}/src/main/webapp para montar la aplicación mientras estamos desarrollando. Prueba de ello es que normalmente usamos: mvn compile war:inplace

Una vez que hemos actualizado el archivo pom.xml, vamos a configurar Eclipse para que podamos invocar a Maven con los argumentos que necesitamos:

  1. Run > External Tools > Open External Tools Dialog
  2. Sobre Program, pulsamos el botón derecho y  New
  3. Definimos un nombre para esta tarea (junto a Name)
  4. Estando sobre la pestaña Main:
    1. Location: Indicamos donde se encuentra el ejecutable de Maven
    2. Working directory: Navegamos por Working Directory y seleccionamos nuestro proyecto
    3. Arguments: Indicamos los argumentos que nos interesen, por ejemplo: compile war:inplace jetty:run. Con estos argumentos conseguimos que nuestro proyecto pase por todas las fases del ciclo de vida definido en Maven hasta llegar a la fase de compilación. Esto nos garantizará que se han generado todos nuestros recursos (web.xml, struts-config.xml, etc), se ha aplicado nuestro perfil correspondiente (profiles.xml), se ha compilado nuestras clases, se han obtenido nuestras dependencias y que nuestra aplicación se ha construido en ${basedir}/src/main/webapp.
  5. Aplicar
  6. Cerrar

Si todo ha ido bien, estaremos dispuestos a ejecutar la tarea. Para ello:

Captura de pantalla de Eclipse

He preparado un screencast de la consola de Eclipse simplemente para que vea como se ejecutan las distintas tareas que se le indican a Maven y como posteriormente se lanza Jetty con nuestra aplicación.

Y ahora lo más importante para poder desarrollar con estos ingredientes, la depuración. ¿Qué tenemos que hacer para poder depurar? El siguiente objetivo es claro. Ahora necesitamos seguir usando la perspectiva de depuración de Eclipse de igual forma que la usamos en otros proyectos o la usamos cuando usamos Apache Tomcat.

Tenemos que modificar la tarea que hemos creado. Para ello, editamos la tarea, y sobre la pestaña Environment, añadimos la variable MAVEN_OPTS con el valor: -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=4000,server=y,suspend=y

Una vez modificada la tarea:

  1. Run > Open Debug Dialog
  2. Sobre Remote Java Application, pulsamos con el botón derecho y New
  3. Definimos un nombre (junto a Name)
  4. Y sobre la pestaña Connetion:
    1. Project: Selecionamos nuestro proyecto
    2. Connection Properties:
      1. Host: localhost
      2. Port: 4000 (el que hemos indicando en MAVEN_OPTS).
  5. Aplicar
  6. Cerrar (aun no debemos depurar nada)

Teniendo la tarea definida y la configuración para la depuración, estamos en disposición de comprobar si todo ha ido bien. Para ello, he preparado un segundo screencast.

Algunas referencias donde viene todo esto explicado:

  1. Debugging with the Maven Jetty Plugin inside Eclipse
  2. Maven Jetty Plugin

Un problema con el que me he encontrado, y parece que más gente, es que cuando se desea terminar la tarea que acabados de ejecutar el proceso no se detiene y Jetty continua en ejecución. Si las tareas que hemos definido las ejecutamos desde la línea de comandos todo funciona perfectamente. Al pulsar CTRL+C, la tarea de Maven termina y Jetty de apaga correctamente. Parece que hay un parche que nos ayuda a terminar la tarea que aun no he probado.

Es probable que la integración mejore considerablemente cuando hagan compatible con la versión 6 de Jetty el plugin de Eclipse Jetty Launcher.

Existen otras formas de integración con los mismos ingredientes. Sin embargo esta es la que interesante me ha parecido, entre otras cosas porque no nos hemos tenido que preocupar ni de descargar Jetty.

2 thoughts on “Ingredientes: Eclipse, Jetty y un proyecto J2EE descrito con Maven

Leave a Reply

Your email address will not be published. Required fields are marked *