2011-08-28 15 views
17

Estoy creando un arquetipo Maven que genera un esqueleto de proyecto que incluirá una dependencia en el proyecto del que se originó el arquetipo .¿Cómo incrustar la versión de proyecto de arquetipo en el arquetipo de Maven?

Por ejemplo, el proyecto de origen se parece a:

origin/archetype/... archetype for generating project 
     /core/... core services 
     /extra/... extra services 

y el arquetipo va a generar un proyecto con un POM que contiene dependencias de este modo:

<dependencies> 
    <dependency> 
    <groupId>com.foo</groupId> 
    <artifactId>origin-core</artifactId> 
    <version>SOMEVERSION</code> 
    </dependency> 
</dependencies> 

Quiero SOMEVERSION a ser el versión del proyecto de origen en el momento que el arquetipo está construido e instalado en el repositorio.

Así que si el proyecto origen está en la versión 1.0-SNAPSHOT y es mvn install ed, entonces yo quiero el arquetipo para generar una dependencia de origin-core 1.0-SNAPSHOT. Y cuando se lanza el proyecto de origen y se ejecuta automáticamente a la versión 1.0, quiero que el arquetipo genere una dependencia en origin-core 1.0.

Básicamente me gustaría usar ${archetypeVersion} como una variable de velocidad en el arquetipo POM, pero eso no parece posible.

¿Hay alguna otra manera de lograr lo que estoy tratando de hacer aquí?

Respuesta

32

Hice la pregunta anterior en la lista de correo de Maven hace unos días y conseguí plantas rodadoras. Afortunadamente, finalmente lo descubrí por mi cuenta. Aquí hay al menos una forma sensata de lograr esto:

Utilice el filtro Maven en su archivo src/main/resources/archetype-resources/pom.xml para sustituirlo en la versión de proyecto actual al construir el arquetipo.

Así es como se hace eso:

modificar su archivo archetype/pom.xml para permitir el filtrado en el archivo archetype-resources/pom.xml y no en cualquier otra cosa (porque sus archivos arquetipo, naturalmente, tendrá ${variable} s por todo el lugar y no desea que los para ser sustituido en tiempo de compilación, desea que sean sustituidos cuando se crea el arquetipo).

<resources> 
    <resource> 
    <directory>src/main/resources</directory> 
    <filtering>true</filtering> 
    <includes> 
     <include>archetype-resources/pom.xml</include> 
    </includes> 
    </resource> 
    <resource> 
    <directory>src/main/resources</directory> 
    <filtering>false</filtering> 
    <excludes> 
     <exclude>archetype-resources/pom.xml</exclude> 
    </excludes> 
    </resource> 
</resources> 

Habilitar un carácter de escape para su uso durante el filtrado, para que pueda escapar de todas las variables en su pom arquetipo que necesitan para seguir siendo tal cual para que puedan ser sustituidos en el tiempo de generación arquetipo:

<pluginManagement> 
    <plugins> 
    ... 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-resources-plugin</artifactId> 
     <version>2.5</version> 
     <configuration> 
     <escapeString>\</escapeString> 
     </configuration> 
    </plugin> 
    </plugins> 
</pluginManagement> 

(Observe que los elementos <resources> y <pluginManagement> que se muestran arriba deben colocarse dentro del elemento <build> de su POM.)

Uso ${project.version} en su pom arquetipo, donde desea la versión de su proyecto arquetipo que se inserta, y escapar de todas las otras variables que deben permanecer sin sustituir hasta la hora de la generación de arquetipo:

<?xml version="1.0" encoding="UTF-8"?> 
<project ...> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>\${groupId}</groupId> 
    <artifactId>\${artifactId}</artifactId> 
    <version>\${version}</version> 
    <packaging>jar</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>origin-core</artifactId> 
     <version>${project.version}</version> 
    </dependency> 
    </dependencies> 

</project> 
+0

Exactamente lo que acabo de necesitar. Muchas gracias. –

+0

¡Funciona como un encanto! Gracias. – Malvin

+0

Esto es tan dulce, excelente publicación. – ocarlsen

12

Una alternativa solución a la respuesta aceptada es filtrar una propiedad predeterminada en el archivo archetype's descriptor/metadata

esto se hace así:

el experto filtrar sólo filtra este archivo:

<resources> 
<resource> 
    <directory>src/main/resources</directory> 
    <filtering>true</filtering> 
    <includes> 
     <include>META-INF/maven/archetype-metadata.xml</include> 
    </includes> 
</resource> 
<resource> 
    <directory>src/main/resources</directory> 
    <filtering>false</filtering> 
    <excludes> 
     <exclude>META-INF/maven/archetype-metadata.xml</exclude> 
    </excludes> 
</resource> 
</resources> 

El archivo arquetipo meta datos:

<archetype-descriptor ...> 
    <requiredProperties> 
     <requiredProperty key="projectVersion"> 
      <defaultValue>${project.version}</defaultValue> 
     </requiredProperty> 
    </requiredProperties> 

    ... 
</archetype-descriptor> 

y POM del arquetipo serían similares a la anterior, pero que sería utilizar el valor de la propiedad requerida projectVersion como la versión del proyecto:

<?xml version="1.0" encoding="UTF-8"?> 
<project ...> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>${groupId}</groupId> 
    <artifactId>${artifactId}</artifactId> 
    <version>${version}</version> 
    <packaging>jar</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>origin-core</artifactId> 
     <version>${projectVersion}</version> 
    </dependency> 
    </dependencies> 

</project> 

Este enfoque tiene la ventaja de que evita tener que escapar de todos los valores de propiedad en el POM del arquetipo y la configuración del complemento de recursos que lo acompaña . Personalmente, encuentro todo eso bastante feo y propenso a errores.

Significa que al usuario se le pide que confirme o modifique la versión del proyecto al generar el arquetipo. Dependiendo de la situación, creo que esto podría considerarse algo bueno o malo.

+0

Esta solución es definitivamente mejor que la aceptada. Muchas gracias por esto Ahorro mucho de mi tiempo –

-1

Intenté algo bastante estúpido y parece haber funcionado. He añadido lo siguiente a mi archivo META-INF/experto/arquetipo-metadata.xml:

<requiredProperties> 
    <requiredProperty key="archetypeVersion"> </requiredProperty> 
</requiredProperties> 

Se podría pensar que lo sabría por defecto, pero no lo hace así que esto parece recordar que la utilice . Tal vez se deba a un error en maven.

+0

No funciona si usa el modo interactivo y debe filtrar los recursos de prueba de arquetipo. Opcionalmente puede confiar en la respuesta @PhilMander para hacer el trabajo. – LoganMzz

Cuestiones relacionadas