2010-02-11 21 views
5

Estoy intentando construir un jar que tenga un archivo xml como recurso. Me gustaría aplicar un filtro a ese xml para insertar el nombre de una dependencia en el xml. El filtrado está funcionando, porque pude ingresar ${project.build.finalName} y reemplazarlo. He encontrado que la propiedad one hint Busco podría serCómo filtrar recursos en Maven, reemplazando con un artefacto de dependencias?

${project.dependencies[0].artifactId} 

pero eso no parece funcionar. Estoy buscando para reemplazar

<fileName>${project.dependencies[0].artifactId}</fileName> 

con

<fileName>OtherLibrary</fileName> 

¿Es posible?

XML, que está en src/main/resources:

<somenode> 
    <fileName>${project.dependencies[0].artifactId}</fileName> 
</somenode> 

pom.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <modelVersion>4.0.0</modelVersion> 
<groupId>com.foo</groupId> 
<artifactId>Thing</artifactId> 
<version>1.0-SNAPSHOT</version> 
<name>Thing</name> 
<url>http://maven.apache.org</url> 
<build> 
    <resources> 
     <resource> 
      <directory>${basedir}/src/main/resources</directory> 
      <filtering>true</filtering> 
     </resource> 
    </resources> 
</build> 
<dependencies> 
    <dependency> 
     <groupId>com.pts</groupId> 
     <artifactId>OtherLibrary</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
</dependencies> 
</project> 
+0

2.2.1 Esta es experta en el camino. – Jim

Respuesta

7

Maldición, tienes razón, esta propiedad no son reemplazados durante el filtrado de recursos. Es extraño y suena como un error en el Maven Resources Plugin porque esta propiedad está interpolada correctamente durante la fase process-resources, como demostraré en la solución alternativa que estoy sugiriendo a continuación (en función del maven-antrun-plugin y la tarea replace).

En primer lugar, añada lo siguiente a su POM:

<plugin> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <executions> 
     <execution> 
     <phase>process-resources</phase> 
     <configuration> 
      <tasks> 
      <echo>${project.dependencies[0].artifactId}</echo><!-- I'm a test --> 
      <replace file="${project.build.outputDirectory}/myxmlfile.xml" 
        token="@@@" value="${project.dependencies[0].artifactId}"/> 
      </tasks> 
     </configuration> 
     <goals> 
      <goal>run</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 

A continuación, actualizar el archivo XML en:

<somenode> 
    <fileName>@@@</fileName> 
</somenode> 

Con estos cambios, correr mvn process-resources produciría el siguiente resultado:

$ cat target/classes/myxmlfile.xml 
<somenode> 
    <fileName>OtherLibrary</fileName> 
</somenode> 

Lo que demuestra que la propiedad se interpola (pero no se establece durante el maven fi filtrado de recursos) . Y si necesita filtrar más de un archivo, la tarea replace puede tomar un conjunto de archivos. Adáptelo a sus necesidades.

En realidad, sería bueno para crear un nuevo Jira para este error en el Maven 2.x Resources Plugin. He creado MRESOURCES-118.

+0

la interpolación y el filtrado no utilizan el mismo algoritmo, por lo que el filtrado solo tendrá un subconjunto de las expresiones –

+0

@Brett Gracias por la explicación. –

+0

Gracias por agregar el informe de errores y por la solución. – Jim

1

Las propiedades indexadas solo estarán disponibles dentro de la configuración del complemento debido a la forma en que Maven interpola el POM, por lo que está disponible para la tarea de reemplazo de un usuario, pero no para el filtrado.

Sin embargo, acceder a las dependencias por índice no es muy robusto; es susceptible a cambios en el elemento primario. Es posible utilizar en su lugar el siguiente en pom.xml:

<properties> 
    <fileName>some-name</fileName> 
</properties> 
... 
<dependency> 
    <groupId>your.group.id</groupId> 
    <artifactId>${fileName}</artifactId> 
    ... 
</dependency> 

continuación, puede seguir usando para filtrar el nombre de propiedad:

<somenode> 
    <fileName>${fileName}</fileName> 
</somenode> 
+1

En realidad, intenté con lo que está sugiriendo en la primera solución cuando estaba escribiendo mi respuesta (y lo mencioné en http://jira.codehaus.org/browse/MRESOURCES-118) pero esto no funcionó, usted Obtendrá ' $ {project.dependencies [0] .artifactId}' en el recurso filtrado. Pero la segunda solución es definitivamente una buena. –

+0

tienes razón, lo siento. Los mecanismos de interpolación son algo que ha experimentado un gran cambio entre Maven 2.0.x, 2.2.x y 3.0. Creo que esta expresión solo estará disponible dentro de la configuración del complemento en la mayoría de las versiones de Maven, por lo que es mejor no confiar en ella en absoluto. –

+0

Debo señalar que la razón por la que estoy buscando esto es lo que supongo que es una situación/borde único en el caso de que necesite agregar un jar no EJB a mi persistence.xml. Y como el complemento ear no tiene forma de especificar la convención de nomenclatura para los archivos jar en la carpeta lib, he seguido este camino. El plugin war tiene una buena manera de hacer que los jars sigan un patrón de nomenclatura que me gustaría tener. Ver http://jira.codehaus.org/browse/MEAR-98 por ejemplo. Eventualmente voy a codificar el jar no-ejb de la existencia. Es solo un frasco que heredé y estoy trabajando para integrarlo. – Jim

Cuestiones relacionadas