La mayoría de las veces que desarrollo aplicaciones web para Tomcat necesito hacer pruebas rápidamente para comprobar que lo que estoy haciendo funciona correctamente y se ve como debe.
Para conseguir una velocidad óptima en estas pruebas, existe la opción de crear un Servidor en Eclipse y publicar la aplicación, así cada vez que haga un cambio en el código fuente, este se compila y despliega automáticamente en el servidor, pudiendo pasar rápidamente a la fase de pruebas.
Este método está muy bien y puede que sea la manera más rápida de probar, de hecho, suelo utilizarla mucho en las fases iniciales de los proyectos cuando todo es desarrollo nuevo y nada es mantenimiento. Desafortunadamente esta opción tiene también sus contras. La mayoría de las veces, los entornos de integración, de calidad o pre-productivos no tienen instaladas herramientas de desarrollo como Eclipse, incluso ni si quiera tienen instalados gestores de ventanas para así aligerar el consumo de RAM y de CPU.
Por esto, una de mis alternativas favoritas y dado que la mayor parte de las veces utilizo MAVEN para la gestión del ciclo de vida de las aplicaciones Java, es utilizar el plugin Maven de Tomcat.
Esta entrada no es más que un resúmen práctico para incluir este plugin en los desarrollos Java.
Requisitos para seguir el ejemplo.
Para reproducir el ejemplo y tenerlo operativo al 100% he utilizado las siguientes herramientas para hacerlo funcionar.
IDE desarrollo: Eclipse 3.6 (Neon).
Máquina virtual Java: JDK 1.8.0_65.
Servidor de aplicaciones: Apache Tomcat 8.5
Ciclo de vida: Maven 3.x (en mi caso la 3.3.9).
Es necesario haberse descargado el servidor de aplicaciones (contenedor JSP/Servlets en este caso) y poder acceder a la URL http://<dirección ip>:<puerto>/manager. También es necesaria una aplicación web a la que añadiremos todo lo necesario para probar el despliegue automático en dicho servidor.
Configurar tomcat para poder hacer despliegues vía script.
Para subir al servidor de Tomcat una aplicación, el plugin de maven utiliza por defecto la interfaz de administración http://servidor:puerto/manager/text. Para poder utilizar esta interfaz, el usuario de tomcat debe contar con el rol manager-script, si no la publicación no funcionará correctamente.
Para ello, en el fichero $CATALINA_BASE/conf/tomcat_users.xml hay que asignar este rol a un usuario existente, o crear un usuario para este tipo de despliegues con este rol.
Fichero: $CATALINA_BASE/conf/tomcat_users.xml
[...] <user username="eduardo" password="xxxxxxx" roles="manager-gui,manager-script"/> [...]
En este caso, el usuario eduardo tiene permisos para subir aplicaciones desde la interfaz web (manager-gui) y desde el plugin de Maven (manager-script).
Añadir el plugin de tomcat a la aplicación.
Añadir el plugin de tomcat en la aplicación se hace en el fichero pom.xml.
Fichero: pom.xml
[...]
<build>
<plugins>
[...]
<!-- Tomcat plugin -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<url>http://localhost:8080/manager/text</url>
<username>username</username>
<password>password</password>
</configuration>
</plugin>
[...]
</plugins>
</build>
El plugin tomcat7-maven-plugin pese al nombre funciona correctamente con Tomcat7, Tomcat8 y Tomcat85. No lo he probado con Tomcat9 debido a que todavía está en su versión Milestone en el momento de crear esta entrada.
La url para desplegar en Tomcat mediante script es http://servidor:puerto/manager/text.
El username y el password son el usuario y la contraseña de un usuario con el rol manager-script.
Por defecto, el plugin publica la aplicación con el nombre como contexto de aplicación. Se puede cambiar este contexto en la configuración del plugin añadiendo la entrada <path>/nombre-contexto</path>. Por ejemplo, imaginemos que se quiere diferenciar las publicaciones hechas en el entorno de integración de las hechas en el entorno de desarrollo, se añade <path>/xxxxx-integracion</path>; donde xxxxxx puede ser el nombre de la aplicación. De esta forma ya podríamos acceder a la aplicación desde este nuevo contexto: http://localhost:8080/xxxxxx-integracion/.
Adicionalmente, el contenido de <path> podría incluirse en un fichero de propiedades para diferentes perfiles de maven y así conseguir que el pom.xml sea el mismo en todos los entornos y solo cambie la manera de invocarlo. Pero estas configuraciones más avanzadas de MAVEN no son el objeto de esta entrada y las dejaremos para otro momento.
Ejecutar el despliegue en Tomcat utilizando Maven.
Una vez que todo está configurado correctamente, es el momento de ejecutar el despliegue utilizando Maven.
Para ejecutarlo se lanza el siguiente comando:
mvn org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:redeploy
La respuesta sería algo así:
[INFO] [INFO] <<< tomcat7-maven-plugin:2.2:redeploy (default-cli) < package @ xxxxxx<<< [INFO] [INFO] --- tomcat7-maven-plugin:2.2:redeploy (default-cli) @ xxxxxx--- [INFO] Deploying war to http://localhost:8080/xxxxxx Uploading: http://localhost:8080/manager/text/deploy?path=%2Fxxxxxx&update=true Uploaded: http://localhost:8080/manager/text/deploy?path=%2Fxxxxxx&update=true (3118 KB at 1734.6 KB/sec) [INFO] tomcatManager status code:200, ReasonPhrase: [INFO] OK - Desplegada aplicación en trayectoria de contexto /xxxxxxx [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 8.679 s [INFO] Finished at: 2016-09-02T12:36:59+02:00 [INFO] Final Memory: 15M/201M [INFO] ------------------------------------------------------------------------
Links
Página oficial del plugin de maven para Tomcat 7