Buscar este blog

domingo, 4 de agosto de 2013

Aplicar filtrado Maven en applicationContext

En casi todas las aplicaciones web, a la hora de plantearse el desarrollo es necesario tener en cuenta los distintos entornos en los que se desplegará (Test, Preproducción y Producción, entre otros). Habrá ciertas variables que dependerán de estos entornos, como rutas o algunos parámetros de configuración que habrá que ir actualizando a medida que se hacen los pases.

Una forma sencilla de hacer esto es emplear los filter de maven. Su uso más extendido es el aplicado a los resources de la aplicación, pero también se pueden emplear en el webapp de las aplicaciones web.

En este ejemplo se va a cambiar un parámetro dentro del applicationContext.xml de Spring. Esto también se puede hacer empleando el Expresion Language de Spring y el conf.properties, aunque aquí se hará con filters Maven.

Necesitamos:
  • Uno o mas profiles donde indicar el fichero que contendrá las variables
  • Añadir la sección de filters indicando qué fichero emplear
  • Plugin de resources
  • Configurar war plugin para filtrar el webapp
  • Emplear la variable en el applicationContext

En el pom.xml declaramos los profiles, en los que se especifica en qué ruta está el fichero que contiene las variables a sustituir:


<profiles>
    <!-- Development environment -->
    <profile>
       <id>development</id>
       <activation>
          <activeByDefault>true</activeByDefault>
       </activation>
       <properties>
           <filters.ficheroProperties>src/dev/filters/desarrollo- env.properties</filters.ficheroProperties>
       </properties>
    </profile>
</profiles>


Esto simplemente declara la variable filters.ficheroProperties con el src/dev/filters/desarrollo-env.properties, cuando se emplee el profile devolpment (en este caso es por defecto). Aquí se añadiría un profile por cada entorno y a la hora de generar los wars habría que usar el parámetro -P referenciando el que correspondiese.

Este fichero será un properties corriente:

mavenProperty.jdbc = jdbc/miDatasource


Dentro del apartado de build, se declaran el fichero que contiene las variables de filtrado. Es aquí donde se usa la variable declarada en el profile, a fin de que cambie en cada entorno.


<!-- Se le indica de qué ficheros se obtienen los valores de las variables que se reemplazan -->
<filters>
      <filter>${filters.ficheroProperties}</filter>
</filters>



En el apartado de plugins, se añade el maven-resources-plugin:

<!-- Plugin para gestionar los resources y el filtrado -->
<plugin>    
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-resources-plugin</artifactId>
       <version>2.4.3</version>
       <configuration>
            <encoding>UTF-8</encoding>
      </configuration>
</plugin>


También en el apartado de plugins, se añade configuración extra al maven-war-plugin:


<plugin>    
     <groupId>org.apache.maven.plugins</groupId>
     <artifactId>maven-war-plugin</artifactId>
     <version>2.3</version>
        <configuration>
           <!-- Configurar filtrado de ficheros dentro del webapp -->
           <webResources>
             <resource>
              <filtering>true</filtering>
              <directory>src/main/webapp/WEB-INF</directory>
              <includes>
                 <include>**/*.xml</include>
              </includes>
            </resource>
          </webResources>
      </configuration>
</plugin>


En este último plugin se indica que se van a filtrar los recursos dentro de WEB-INF cuya extensión sea .xml. De este modo, a la hora de componer el war se van a leer todos los ficheros xml de este directorio buscando variables Maven para reemplazar.


Por último, basta con emplear las variables declaradas en el fichero de properties dentro del applicationContext.xml

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="${mavenProperty.jdbc}" />
</bean>


No hay comentarios:

Publicar un comentario