2009-08-28 7 views
7

Estoy usando Maven2 para construir un proyecto de WAR. Algunos archivos de propiedades dependen del entorno para el lanzamiento.¿Cómo entregar archivos de propiedades además de artefactos?

Deseo entregar, además del WAR, un archivo llamado datasource.xml. Este archivo ya existe en mi directorio de proyecto, pero contiene propiedades que se filtrarán durante la compilación (es decir, algunos ${foo.bar}).

En otras palabras, después de ejecutar el comando mvn instalación limpia, quiero ver en mi directorio target/ dos archivos, my-webapp.war y datasource.xml.

Tenga en cuenta que datasource.xmlno debe incluir en el artefacto my-webapp.war!

¿Cómo puedo hacer esto?

Respuesta

10

Puede conectar artefactos adicionales utilizando build-helper-maven-plugin. La siguiente configuración adjuntaría datasource.xml como artefacto adicional durante la fase del paquete . Si ese artefacto se define fuera de src/main/resources y src/main/webapp, no se incluirá en la guerra.

Actualización: para garantizar que se aplica el filtrado de recursos según su comentario, puede especificar una ejecución del objetivo de copiar recursos de resource-plugin, especificando el filtro que se aplicará. A continuación, puede adjuntar ese artefacto filtrado utilizando build-helper-maven-plugin haciendo referencia al directorio de destino correspondiente. He actualizado el ejemplo a continuación para mostrar este uso.

<plugin> 
    <artifactId>maven-resources-plugin</artifactId> 
    <version>2.4</version> 
    <executions> 
    <execution> 
     <id>copy-resources</id> 
     <phase>validate</phase> 
     <goals> 
     <goal>copy-resources</goal> 
     </goals> 
     <configuration> 
     <outputDirectory>${project.build.outputDirectory}/datasource</outputDirectory> 
     <resources>   
      <resource> 
      <directory>src/main/datasource</directory> 
      <filtering>true</filtering> 
      </resource> 
     </resources>    
     </configuration>    
    </execution> 
    </executions> 
</plugin> 
<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>build-helper-maven-plugin</artifactId> 
    <version>1.3</version> 
    <executions> 
    <execution> 
     <id>attach-artifacts</id> 
     <phase>package</phase> 
     <goals> 
     <goal>attach-artifact</goal> 
     </goals> 
     <configuration> 
     <artifacts> 
      <artifact> 
      <file>${project.build.outputDirectory}/datasource/datasource.xml</file> 
      <type>xml </type> 
      <classifier>datasource</classifier> 
      </artifact> 
     </artifacts> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

Esto no aparecerá en la carpeta de destino, pero será desplegado/instalado en el depósito junto con la guerra.

El artefacto adjunto se puede referenciar definiendo una dependencia con el clasificador "fuente de datos". Por ejemplo:

<dependency> 
    <groupId>my.group.id</groupId> 
    <artifactId>my-artifact-id/artifactId> 
    <version>1.0.0</version> 
    <classifier>datasource</classifier> 
    <type>xml</type> 
</dependency> 

podría utilizar el plugin de dependencia de copy goal para recuperar el artefacto y ponerlo donde quiera que se requiere como parte de su proceso de implementación.

+0

Esto no es exactamente lo que estoy buscando (solo necesito el datasource.xml para ubicarlo en el destino/directorio, no instalado en el repositorio), pero esta solución es bastante interesante. – romaintaz

+0

Esta solución no se ajusta a mi necesidad también porque el archivo XML copiado en el repositorio * no * está filtrado (es decir, todavía tengo $ {foo.bar} en él). – romaintaz

+0

para que quede claro, quiere que se aplique el filtrado de recursos, pero ¿el artefacto no se incluirá en la guerra? –

Cuestiones relacionadas