Maven para desplegar en un Tomcat desde el Eclipse
En esta entrega vamos a ver en 5 pasos cómo desplegar un war realizado con maven en un tomcat local o remoto desde el eclipse.
Vamos a asumir que
tenemos un eclipse con los plugins de Maven y que tenemos un tomcat en
nuestro ordenador. En nuestro caso vamos a desplegar un war que de un
proyecto Maven, llamado starter que genera un artefacto "andy.war".
La versión de eclipse
utilizada es Helios y los tomcat son un 5.5 en local y un tomcat 6 sobre
una máquina virtual(remoto). Por lo demás creo que no hay nada más
especial, la versión del jdk es la 1.6 y como plugins en el eclipse
además de los de maven el de subversion apuntando a un repositorio de
una máquina virtual.
Primer paso: Crear una cuenta de manager en tomcat:
Para ello vamos hasta el directorio del tomcat, carpeta conf y allí editamos el archivo "tomcat-users.xml"
<tomcat-users>
<role rolename="manager"/>
<role rolename="tomcat"/>
<role rolename="role1"/>
<user username="tomcat" password="tomcat" roles="manager"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
</tomcat-users>
En un alarde de ingenio y
originalidad creamos una cuenta "tomcat" con contraseña "tomcat" con el
rol de "manager". Siéntete libre de crear la cuenta de manager con
usuario "dsx58969" y contraseña "g8r45ft"... pero luego acuerdate de
ellos.
Segundo paso: Indicarle a Maven nuestro tomcat.
Para lo cual debemos
editar el archivo setting.xml de la carpeta .m2. Dicha carpeta se
debería encontrar en el directorio del usuario.
Allí está casi todo
comentado, pero nos encontreremos un apartado "servers" en el cual vamos
a definir nuestro servidor. Podemos definir varios.
<server>
<id>beaduerme</id>
<username>tomcat</username>
<password>tomcat</password>
</server>
Yo le he puesto el
identificador "beaduerme" pero puedes ponerle otro cualquiera. El lector
sagaz tardará poco en verle la lógica a los otros dos parámetros:
username y password. Quizá en tu caso sea "dsx58969".....:-P
Destacar el hecho de que
los parámetros de conexión residen en un archivo que no se suele
intercambiar, el de preferencias de maven. Si estuviesen en el pom cada
miembre del equipo tendría que cambiarlo a los de su tomcat local.
Tercer paso. Editar el POM.
Es preciso añadir al pom.xml el plugin apropiado en al apartado del build.
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<configuration>
<server>beaduerme</server>
<path>/andy</path>
</configuration>
</plugin>
El groupId y el artefacto
son los que corresponden para poder ejecutar la tarea maven apropiada. A
nosotros nos corresponde la configuración. En server ponemos el
identificador que hemos definido en la configuración de maven y en el
path la ruta donde debe desplegarse el war. En mi caso voy a desplegar
una aplicación andy.war
El apartado build del pom, quedaría como esto:
<build>
<finalName>andy</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<configuration>
<server>beaduerme</server>
<url>http://localhost:7777/manager</url>
<path>/andy</path>
</configuration>
</plugin>
</plugins>
</build>
En el subapartado de
configuración del plugin hemos puesto la url del tomcat. Si estuviesemos
utilizando el puerto por defecto del tomcat, el 8080, sería innecesaria
dicha linea.Ya que el plugin toma por defecto "<url>http://localhost:8080/manager</url>". Si el path que queremos para desplegar es el implicito del war también podríamos prescindir de la linea path.
El puerto por defecto de escucha se configura desde el archivo server.xml que se encuentra en la carpeta conf del tomcat.
<Connector port="7777" maxHttpHeaderSize="8192"
maxThreads="50" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443"
connectionTimeout="20000" disableUploadTimeout="true" />
Cuarto paso: Lanzar el tomcat.
Por ejemplo ir hasta la carpeta bin del tomcat y hacer doble click sobre startup.bat.
Puede ser el momento
apropiado para comprobar que podemos acceder desde localhost al manager
con el nombre de usuario y contraseña que hemos indicado en el paso 1.
Destacar que el tomcat
puede estar en una máquina remota y/o estar escuchando en otro puerto,
lo único que cambiará en el pom la url.
Se ha probado este
minitutorial desplegando en un tomcat 5.5 local y en un tomcat6 remoto.
Merece la pena destacar que en el tomcat 6 se indica que a la hora de
definir usurios y roles indica que hay que definir un "manager-gui", en
versiones anteriores era "manager", para entrar en la consola de
gestión.... Para que el plugin funcione correctamente en el tomcat 6 hay
que definir el rol como "manager".
Así el tomcat-user.xml del tomcat 6 es tal que así:
<tomcat-users>
<!-- TOMCAT 6
NOTE: By default, no user is included in the "manager-gui" role required to operate the "/manager/html" web application. If you
wish to use this app, you must define such a user - the username
and password are arbitrary.
-->
<role rolename="manager"/>
<user username="tomcat" password="tomcat" roles="manager"/>
</tomcat-users>
Quinto paso. Desplegar desde el eclipse
Para ello iremos a Run As.. Run Configurations ...
Ojo. Para que esto funcione el tomcat tiene que estar lanzado. "Deploy" no lanza el tomcat
Y escribiremos en una configuración de maven el "Goal" tomcat:deploy
Si la ejecutamos la salida en la consola del eclipse debería ser algo como esto...
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Struts 2 Starter 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> tomcat-maven-plugin:1.1:deploy (default-cli) @ andy >>>
.......
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running es.home.andy.prueba.HelloWorldActionTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.031 sec
Running es.home.andy.prueba.IndexActionTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
Results :
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] --- maven-war-plugin:2.1.1:war (default-war) @ andy ---
....
[INFO] <<< tomcat-maven-plugin:1.1:deploy (default-cli) @ andy <<<
[INFO]
[INFO] --- tomcat-maven-plugin:1.1:deploy (default-cli) @ andy ---
[INFO] Deploying war to http://localhost:7777/andy
[INFO] OK - Desplegada aplicación en trayectoria de contexto /andy
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.594s
[INFO] Finished at: Sun Nov 06 11:47:08 CET 2011
[INFO] Final Memory: 5M/35M
[INFO] ------------------------------------------------------------------------
Nos compila, pasa los test y nos despliega en el tomcat.
Para replegarla podemos crear otra configuración identica a la anterior con el Goal "tomcat:undeploy". Al ejecutarla obtenemos en la consola del eclipse el resultado esperado
....
[INFO] ------------------------------------------------------------------------
[INFO] Building Struts 2 Starter 1.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- tomcat-maven-plugin:1.1:undeploy (default-cli) @ andy ---
[INFO] Undeploying application at http://localhost:7777/andy
[INFO] OK - Replegada aplicacación en trayectoria de contexto /andy
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.906s
[INFO] Finished at: Sun Nov 06 12:22:09 CET 2011
[INFO] Final Memory: 3M/15M
[INFO] -----------------------------------------------------------------------
Apendice
Se ha probado a
desplegarlo en un tomcat remoto, en 192.168.2.54 simplemente cambiando
en el pom. En ese tomcat tengo el mismo usuario y pass para el rol de
manager.
Si tuviera distintos user/pass podría definir en el setting.xml de maven otro server y referenciarlo en el pom apropiadamente
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<configuration>
<server>beaduerme</server>
<url>http://192.168.2.54:7000/manager</url>
<path>/andy</path>
</configuration>
</plugin>