24 March 2011

Desplegando con diferentes ficheros de configuración usando profiles y resources

Hace poco puse unos apuntes a cerca de como desplegar usando diferentes ficheros de configuración, dependiendo del entorno de despliegue; digamos que ahora explicaré lo mismo pero de otra forma, para complacer a aquellos puristas de maven :-)

A continuación se expondrán tres grandes secciones de como hacer esto:
  1. La definición de que archivos copiar y excluir
  2. La configuración del plugin Maven Resources
  3. La definición de profiles

La definición de que archivos copiar y excluir
La escencia básicamente es copiar unos determinados recursos y excluir otros; y la forma de indicar esto es utilizando el tag resources dentro del tag build, donde en la invocación se utilice una propiedad que indique que recursos incluir.

<build>
  ...
  <resources>
    <resource>
        <directory>src/main/resources</directory>
          <includes>
              <include>**.*</include>
              <include>custom/${deploy.target.folder}/**.*</include>
          </includes>
        <excludes>
            <exclude>custom/**.*</exclude>
        </excludes>
    </resource>
  </resources>
  ...

En el snippet anterior, por defecto se excluyen todos los ficheros dentro del directorio src/main/resources/custom, pero se incluyen todos los ficheros de la carpeta src/main/resources y src/main/resources/custom/${deploy.target.folder}, donde la propiedad deploy.target.folder indica la subcarpeta, de cuyo contenido si que hay que incluir; los posibles valores para esta propiedad se informarán desde los perfiles maven creados para cada entorno destino.

La configuración del plugin Maven Resources
Ahora queda controlar la copia de los recursos del proyecto al directorio destino de la generación del ejecutable; para ello disponemos del goal resources:copy-resources perteneciente al plugin Maven Resources.

<build>
  ...
  ...resources...
  ...
   <plugins>
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.4.3</version>
        <executions>
          <execution>
            <id>copy-resources</id>
            <phase>validate</phase>
            <goals>
              <goal>copy-resources</goal>
            </goals>
            <configuration>
              <outputDirectory>${project.build.directory}/${project.build.finalName}/images</outputDirectory>
              <resources>
                <resource>
                  <directory>src/main/resources/custom/${deploy.target.folder}/images</directory>
                </resource>
              </resources>
            </configuration>
          </execution>
        </executions>
      </plugin>

    </plugins>

La definición de profiles
Ahora solo queda definir los perfiles, uno para cada entorno de despliegue.
...
  <profiles>
    <profile>
      <id>integracion</id>
      <properties>
        <deploy.target.folder>int</deploy.target.folder>
      </properties>
    </profile>
    <profile>
      <id>pre-produccion</id>
      <properties>
        <deploy.target.folder>pre</deploy.target.folder>
      </properties>
    </profile>
    <profile>
      <id>produccion</id>
      <properties>
        <deploy.target.folder>pro</deploy.target.folder>
      </properties>
    </profile>    
  </profiles>
  ...

No esta demás decir que en nuestro proyecto tendremos que disponer de los directorios:
  • src/main/resources/custom/int
  • src/main/resources/custom/pre
  • src/main/resources/custom/pro

Y que en cada uno de estos directorios existen los mismos recursos ;-).

Bueno este artículo a sido fruto de la colaboración de Jordi Carbonell.

Enlaces relacionados:

- FIN -

No comments: