icono_twiter icono LinkedIn icono Facebook Icono Xing
Ángel García Jerez

Consultor tecnológico de desarrollo de proyectos informáticos. Co-autor del libro "Actualización y mantenimiento del PC (Edición de 2010) publicado por Anaya Multimedia

Ingeniero Técnico en Informática de Sistemas e Ingeniero en Informática (premio al mejor expediente de su promoción)

Puedes encontrarme en Autentia: Ofrecemos servicios de soporte a desarrollo, factoría y formación

Somos expertos en Java/J2EE

Ver todos los tutoriales del autor

Fecha de publicación del tutorial: 2011-07-12

Tutorial visitado 7.399 veces Descargar en PDF
Configuración de aplicaciones multientorno con Maven

Configuración de aplicaciones multientorno con Maven

1. Introducción

Maven es una de las herramientas más utilizadas para gestionar y generar la aplicaciones en el mundo Java. Las aplicaciones habitualmente tienen recursos que dependen del entorno donde se ejecutan. En este tutorial os enseñaremos un ejemplo de como configurar maven para poder generar la aplicación para diferentes entornos.

2. Entorno

Entorno utilizado para escribir este tutorial:

  • Hardware: Mac Book Pro (Core 2 Duo 2,8 Ghz, 4 GB RAM, 500 GB)
  • Sistema Operativo: Snow Leopard 10.6.8
  • Maven: 3.0.3

3. Ejemplo práctico

Vamos a poner un ejemplo práctico: tendremos una aplicación web que utiliza la librería Liquibase. Para aquellos que no la conozcáis se encarga de llevar el control de cambios que se van produciendo en nuestro schema de base de datos a lo largo del ciclo de vida de nuestra aplicación. No vamos a entrar en detalle en ella pero para aquellos que tengáis curiosidad os recomiendo que os leáis el siguiente tutorial "Liquibase-Gestión De Cambios En Base De Datos".

Esta librería nos permite definir "contextos" similares a los perfiles de maven o spring. En este caso agrupan conjuntos de cambios (changeset) contra un schema. Estos contextos se activan a través de una propiedad en Liquibase. En este ejemplo configuraremos Liquibase mediante un Listener en el fichero web.xml, aunque existen otras forma de configuración/ejecución.

Habitualmente las aplicaciones utilizan juegos de datos específicos para el entorno de desarrollo que no deben propagarse al resto de entornos. Con Liquibase esto lo podemos realizar fácilmente creando un contexto para desarrollo (development) y otro para producción (production).

Por tanto, dependiendo del entorno donde ejecutemos nuestra aplicación deberemos inicializar Liquibase con unos contextos u otros. Aunque podemos cambiar la configuración de Liquibase cada vez que tengamos que generar la aplicación para cada entorno, lo más óptimo y adecuado es automatizar este proceso utilizando filtros de maven.

4. Preparando el ejemplo

Antes de configurar nuestro proyecto con los filtros de maven vamos a ver el estado inicial de la aplicación antes de añadirlos.

En el fichero web.xml tendremos la configuración de liquibase:

Como podéis ver hemos configurado liquibase mediante su listener y hemos añadido las propiedades necesarias para que este funcione. De todas las propiedades sólo destacaremos "liquibase.contexts" con la que definimos los contextos que van a ser ejecutados. En este caso "development" y "production".

El fichero con las sentencias que se van a ejecutar contra nuestro schema:

Prestad atención al valor de context de los changeset. El primero se ejecutará cuando activemos el contexto de "production" y el segundo en "development".

Y el fichero pom.xml:

Ahora sólo nos queda configurar maven para que podamos generar nuestra aplicación para diferentes entornos.

5 Habilitando los filtros en nuestro proyecto

Lo primero es crear dos ficheros (uno para producción y otro para desarrollo) donde añadimos las propiedades con los valores multientorno guardándolos en el directorio src/main/filters.

En nuestro caso los ficheros sólo tendrán una única propiedad : los valores de los contexto que liquibase ejecutará cuando se despliegue la aplicación.

filter-dev.properties

filter-prod.properties

Como os podéis dar cuenta el nombre de los ficheros es muy importante ya que cada uno contendrá los valores correspondientes para cada uno de los entornos.

Ahora debemos configurar Maven para que sustituya los valores de estos ficheros en nuestros recursos de la aplicación. Abrimos el fichero pom.xml y añadimos las siguientes líneas:

En la línea 2 se define la propiedad "env" e indica el entorno para el que maven generará la aplicación web. Por defecto el valor es "prod", en el caso de que queramos cambiar el valor podremos hacerlo mediante perfiles de maven o añadiendo un parámetro al ejecutar maven por línea de comandos (al final del tutorial configuraremos un perfil que cambia el valor de esta propiedad).

En la línea 7 indicamos el fichero de propiedades que utilizará maven para sustituir los valores multientorno. Como podéis ver tiene el patrón ${env}. Con esto conseguimos que cuando se ejecute maven utilice el fichero de producción o de desarrollo en función del valor de la propiedad.

Y por último configuramos el plugin maven-war-plugin para que sustituya todos los patrones de los recursos de la aplicación por el valor definido en los ficheros de filtros. Hacer hincapié en la línea 17 donde se habilita la ejecución de los filtros, la línea 18 que indica sobre que directorio se aplica los filtros y la línea 20 con el recurso sobre el que se aplica finalmente los filtros.

Una vez que hemos finalizado toda la configuración de maven tendremos que añadir los patrones en aquellos recursos que dependen de entorno, en nuestro caso el fichero web.xml.

El cambio es mínimo, donde antes teníamos el valor "development,production" ahora debemos tener el nombre de la propiedad de nuestro fichero de filtro entre ${}.

Si ejecutamos "mvn clean package" veremos que el valor que contendrá el fichero web.mxl corresponderá con el valor de la propiedad de filter-prod.properties.

Si queréis descargaros el proyecto de ejemplo lo podréis hacer desde aquí.

6 Habilitando el perfil de desarrollo

Cuando un desarrollador trabaja con este tipo de proyectos es muy habitual que configure un perfil maven para redefinir el valor de la propiedad "env" y así ahorrar bastante tiempo a la hora de generar la aplicación para este entorno.

Únicamente tendrá que modificar su fichero settings.xml con:

Añadimos un perfil con el nombre "development" donde la propiedad "env" tendrá el valor "dev" y en la línea 12 activamos dicho perfil.

Esto hará que cuando generemos el proyecto se haga con las propiedades de desarrollo.

7 Conclusión

Las aplicaciones cuya configuración es dependiente de entorno son muy comunes y con este tutorial hemos querido enseñaros como gestionarlas utilizando maven. Como habéis podido observar es realmente sencillo.

Aunque en este tutorial hemos utilizado los filtros para las aplicaciones multientorno también podéis utilizarlos para otros menesteres según vuestras necesidades.

A continuación puedes evaluarlo:

Regístrate para evaluarlo

Por favor, vota +1 o compártelo si te pareció interesante

Share |
Anímate y coméntanos lo que pienses sobre este TUTORIAL:

Fecha publicación: 2011-07-14-10:00:23

Autor: jcarmonaloeches

Este tipo de uso de Maven orientado a diferentes entornos es algo que se empieza a ver en diferentes lugares de la informática. Y se acopla bien al modelo tradicional de entornos: desarrollo, preproducción, producción.... Dejando para los desarrolladores un trabajo mucho más transparente. En mi opinión, Maven está muy bien, es mucho más versátil y tiene mucho más crecimiento potencial que Ant, además de ofrecer una integración por su parte para el uso de dos herramientas... Muchas gracias por compartir el conocimiento.