I'm creating a Maven archetype which generates a project skeleton that will include a dependency on the project from which the archetype originated.
For example, the origin project looks like:
origin/archetype/... archetype for generating project
/core/... core services
/extra/... extra services
and the archetype will generate a project with a POM that contains dependencies like so:
<dependencies>
<dependency>
<groupId>com.foo</groupId>
<artifactId>origin-core</artifactId>
<version>SOMEVERSION</code>
</dependency>
</dependencies>
I want SOMEVERSION to be the version of the origin project at the time that the archetype is built and installed into the repository.
So if the origin project is at version 1.0-SNAPSHOT and is mvn
install
ed, then I want the archetype to generate a dependency on
origin-core 1.0-SNAPSHOT
. And when the origin project is released, and automatically
bumped to version 1.0, I want the archetype to generate a dependency on
origin-core 1.0
.
Basically I'd like to use ${archetypeVersion}
as a Velocity variable in the archetype
POM, but that doesn't seem possible.
Is there any other way of accomplishing what I'm trying to do here?
In short, Archetype is a Maven project templating toolkit. An archetype is defined as an original pattern or model from which all other things of the same kind are made. The name fits as we are trying to provide a system that provides a consistent means of generating Maven projects.
Archetype configurationYou can see the packaging maven-archetype . You can customize build of your archetype here as with any other pom. However, there is another pom. xml file located under src\main\resources\archetype-resources which is the pom file of the generated project.
The Archetype Plugin allows the user to create a Maven project from an existing template called an archetype. It also allows the user to create an archetype from an existing project. This plugin requires Java 7.
I asked the above question on the Maven mailing list a few days ago and got tumbleweeds. Fortunately, I eventually figured it out on my own. Here's at least one sane way to accomplish this:
Use Maven filtering on your src/main/resources/archetype-resources/pom.xml
file to substitute in the current project version when building the archetype.
Here's how that's done:
Modify your archetype/pom.xml
file to enable filtering on the archetype-resources/pom.xml
file and not on anything else (because your archetype files will naturally have ${variable}
s all over the place and you don't want those to be substituted at build time, you want them to be substituted when the archetype is created).
<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>
Enable an escape character for use when filtering, so that you can escape all the variables in your archetype pom that need to remain as-is so that they can be substituted at archetype generation time:
<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>
(Note the <resources>
and <pluginManagement>
elements shown above should be placed inside the <build>
element of your POM.)
Use ${project.version}
in your archetype pom, where you want the version of your archetype project to be inserted, and escape all of the other variables that should remain unsubstituted until archetype generation time:
<?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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With