webapp que proyecto generate descargar arquetipo archetype agregar java maven maven-archetype

java - generate - ¿Cómo incrustar la versión del proyecto arquetipo en el arquetipo Maven?



que es archetype maven (3)

Hice la pregunta anterior en la lista de correo de Maven hace unos días y obtuve tumbleweeds. Afortunadamente, finalmente lo resolví por mi cuenta. Aquí hay al menos una forma sana de lograr esto:

Use el filtro Maven en su archivo src/main/resources/archetype-resources/pom.xml para sustituirlo en la versión actual del proyecto cuando compile el arquetipo.

Así es como se hace:

Modifique su archivo archetype/pom.xml para habilitar el filtrado en el archivo archetype-resources/pom.xml y no en ninguna otra cosa (ya que sus archivos arquetípicos naturalmente tendrán ${variable} s por todas partes y usted no los quiere para que se sustituyan en el momento de la creación, desea que se sustituyan cuando se cree 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>

Habilite un carácter de escape para usarlo al filtrar, de modo que pueda escapar de todas las variables en su arquetipo pom que deben permanecer como están para que puedan ser sustituidas en el momento de la generación de arquetipos:

<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>

(Tenga en cuenta que los elementos <resources> y <pluginManagement> que se muestran arriba deben ubicarse dentro del elemento <build> de su POM).

Use ${project.version} en su pom de arquetipo, donde desea que se inserte la versión de su proyecto de arquetipo, y evite todas las otras variables que deben permanecer sin sustituir hasta el momento de la generación del 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>

Estoy creando un arquetipo de Maven que genera un esquema de proyecto que incluirá una dependencia del proyecto desde el cual se originó el arquetipo.

Por ejemplo, el proyecto de origen se ve así:

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

y el arquetipo generará un proyecto con un POM que contiene dependencias como las siguientes:

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

Quiero que SOMEVERSION sea la versión del proyecto de origen en el momento en que el arquetipo se construye e instala en el repositorio.

Entonces, si el proyecto de origen está en la versión 1.0-SNAPSHOT y es mvn install ed, entonces quiero que el arquetipo genere una dependencia en origin-core 1.0-SNAPSHOT . Y cuando se lance el proyecto de origen y se cambie 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 Velocity en el arquetipo POM, pero eso no parece posible.

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


Intenté algo bastante estúpido y parece haber funcionado. Agregué lo siguiente a mi archivo META-INF / maven / archetype-metadata.xml:

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

Usted pensaría que lo sabría por defecto, pero no lo hace, por lo que parece recordarle que lo use. Tal vez se deba a un error en el maven.


Una solución alternativa a la respuesta aceptada es filtrar una propiedad predeterminada en el archivo de descriptores / metadatos del arquetipo.

Esto se hace así:

El filtrado de maven solo 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 de metadatos del arquetipo:

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

y el POM del arquetipo sería similar a antes, excepto que usaría 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 se le pide al usuario que confirme o modifique la versión del proyecto al generar el arquetipo. Dependiendo del escenario, supongo que esto podría ser considerado algo bueno o malo.