Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to embed archetype project version in Maven archetype?

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 installed, 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?

like image 278
samskivert Avatar asked Aug 28 '11 18:08

samskivert


People also ask

What is archetype version in Maven?

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.

How do you know the which archetype an existing Maven project is built on?

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.

Which Maven plugin is used for archetype generation?

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.


1 Answers

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>
like image 182
samskivert Avatar answered Oct 14 '22 04:10

samskivert