Perfiles en Maven

maven

Durante el desarrollo de aplicaciones que van a ser utilizadas en distintos entornos (desarrollo, testing, producción, etc) solemos encontrarnos con el problema de adaptar la aplicación a cada uno de dichos entornos. Esto sucede habitualmente con los ficheros de configuración, por ejemplo los parámetros utilizados para la conexión a la base de datos, pero también es posible que necesitemos incluir librerías distintas en función de la versión de Java o incluso el sistema operativo que estamos utilizando.

Maven nos ayuda a solucionar esta problemática de forma elegante mediante el uso de perfiles. Un perfil es una configuración de Maven que sólo queremos aplicar en determinadas circunstancias ya sea especificando explícitamente el perfil a utilizar o bien de forma automática según ciertas condiciones, como por ejemplo la versión del sistema operativo en el que estamos ejecutando Maven. Los perfiles pueden ser definidos de forma específica para un proyecto concreto en su pom.xml o bien de forma más general en el settings.xml de Maven.

En este tutorial veremos cómo utilizar distintas variables o ficheros de configuración en función del perfil que indiquemos aunque el sistema de perfiles de Maven ofrece muchas otras posibilidades.

El problema a resolver

Vamos a suponer que tenemos un proyecto Maven consistente en una aplicación web en el que utilizamos dos ficheros de configuración: el del sistema de logs log4j y otro denominado db.properties con la cadena de conexión a la base de datos. Generalmente un proyecto de este tipo será desplegado en al menos tres entornos diferentes: el equipo de cada desarrollador, un servidor de pruebas y el servidor de producción. Para simplificar en este tutorial vamos a considerar un entorno de desarrollo y otro de producción. En cada entorno usaremos una base de datos y un nivel de log distinto.

Vamos a ver dos posibles formas de solucionar esta problemática para que podamos elegir la alternativa que más nos convenga en cada caso concreto.

Definir las variables en el pom.xml

Con esta estrategia lo que haremos es definir en el pom.xml para cada perfil el valor que queremos darle a cada variable. De este modo tenemos centralizado en un único fichero los parámetros que dependen de cada entorno / perfil.

Seguimos los siguientes pasos:

  1. Definir la sección profiles con los dos perfiles. No vamos a definir ninguna condición de activación automática de los perfiles, aunque podemos establecer uno por defecto. Dentro de cada perfil, se definen las variables y sus valores

    <profiles>
    		<profile>
    			<id>desarrollo</id>
    			<!-- <activation> <activeByDefault>true</activeByDefault> </activation> -->
    			<properties>
    				<log.level>DEBUG</log.level>
    				<db.url>jdbc:mysql://localhost:3306/profiles</db.url>
    				<db.user>dev</db.user>
    				<db.password>devpassword</db.password>
    			</properties>
    		</profile>
    		<profile>
    			<id>produccion</id>
    			<properties>
    				<log.level>INFO</log.level>
    				<db.url>jdbc:mysql://192.168.1.30:3306/profiles</db.url>
    				<db.user>pro</db.user>
    				<db.password>45fgU23</db.password>
    			</properties>
    		</profile>
    	</profiles>
    
  2. Usamos estas variables en los lugares en dónde queremos que sus valores sean aplicados.
    /src/main/resources/log4j.xml

    <pre>
    <root>
       <priority value="${log.level}" />
       <appender-ref ref="console" />
       <appender-ref ref="file" />
    </root>
    </pre>
    

    /src/main/resources/db.properties

    driver=com.mysql.jdbc.Driver
    db.url = ${db.url}
    db.user = ${db.user}
    db.password = ${db.password}
    
  3. Para realizar la sustitución de las variables indicamos los recursos que Maven deben “filtrar”. Generalmente será el directorio /src/main/resources; podemos evitar que el reemplazo se aplique a ciertos ficheros con el elemento excludes.
    <build>
        <resources>
            <resource>
                <filtering>true</filtering>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
    
  4. Aplicamos el perfil a ejecutar con el comando -P. Si no especificamos un perfil y no hay un perfil por defecto, no se aplica ninguno.
    mvn clean package -P desarrollo
    

Un fichero para cada entorno

Otra alternativa consiste en tener un fichero de configuración distinto por cada entorno. Esto es, tendremos un db.properties y log4j.xml para desarrollo y otro db.properties y log4j.xml para producción. De este modo toda la configuración estará en los ficheros correspondientes y no tendremos ningún parámetro de configuración en el pom.xml.

Seguimos los siguientes pasos:

  1. Se organizan los ficheros de configuración en directorios según entornos/perfiles y fuera del /src/main/resources para evitar tener que hacer configuraciones adicionales de ensamblado en Maven. Siguiendo con nuestro ejemplo tendríamos la siguiente estructura en el proyecto:

    maven profile - conf files

  2. En el pom.xml definimos los perfiles indicando para cada uno en una variable con el mismo nombre el directorio en el que se encuentran los ficheros que serán incluidos en el artefacto final si se selecciona el perfil.
    <profiles>
    		<profile>
    			<id>desarrollo</id>
    			<!-- <activation> <activeByDefault>true</activeByDefault> </activation> -->
    			<properties>
    				<profile.dir>src/main/profiles/desarrollo</profile.dir>				
    			</properties>
    		</profile>
    		<profile>
    			<id>produccion</id>
    			<properties>
    				<profile.dir>src/main/profiles/produccion</profile.dir>				
    			</properties>
    		</profile>
    	</profiles>
    
  3. Indicamos que tenemos que añadir al artefacto los ficheros en la ruta indicada en el perfil.
    <build>
    
    		<resources>
    			<resource>
    				<directory>${profile.dir}</directory>
    				<filtering>true</filtering>
    			</resource>
    		</resources>
    
  4. Aplicamos el perfil a ejecutar con el comando -P. Si no especificamos un perfil y no hay un perfil por defecto, no se aplica ninguno.
    mvn clean package -P desarrollo
    

Perfiles en Eclipse

Aunque los artefactos para desplegar generalmente se construyen de forma automatizada mediante scripts o sistemas de integración continua como Jenkins, los proyectos los desarrollamos y probamos desde nuestro IDE. Si estos presentan integración con Maven deberían permitirnos configurar el perfil que queremos utilizar en cada momento.

En mi caso suelo trabajar con Eclipse. Para configurar el perfil a utilizar hay que acceder a la sección Maven dentro de las Properties del proyecto (botón derecho sobre el proyecto).

eclipse maven profiles

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: