maven统一管理项目版本号

简介

Maven 3.5.0版本提供了一种对<version>标签进行统一管理的特性。在此版本之前的maven项目并不支持这一特性

现在可以在<version>标签中使用${revision}${sha1}${changelist}作为占位符。

单个项目中使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache</groupId>
<artifactId>apache</artifactId>
<version>18</version>
</parent>
<groupId>org.apache.maven.ci</groupId>
<artifactId>ci-parent</artifactId>
<name>First CI Friendly</name>
<!-- 设置占位符 -->
<version>${revision}</version>
...
</project>

单个项目中的<version>标签中可以直接使用${revision}${sha1}${changelist}占位符。

(1)执行mvn命令时可以手动指定环境变量来更改占位符的值。如:

1
mvn -Drevision=1.0.0-SNAPSHOT clean package

(2)当前项目的根目录下创建.mvn文件夹,并在该文件夹下创建maven.config文件,在该文件中配置我们在执行mvn命令时额外的参数,如:.mvn/maven.config

1
-Drevision=2.0.0-SNAPSHOT

通过编写上面的文件,我们可以直接使用命令,而无需指定手动指定占位符的值。

1
mvn clean package

(3)在pom.xml文件中设置<properties>标签,指定占位符的值。

1
2
3
<properties>
<revision>3.0-SNAPSHOT</revision>
</properties>

注:${revision}${sha1}${changelist}可以单独使用,也可以混合使用。

多模块项目中使用

多模块项目中使用占位符和单模块项目中一致,父项目类似于:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache</groupId>
<artifactId>apache</artifactId>
<version>18</version>
</parent>
<groupId>org.apache.maven.ci</groupId>
<artifactId>ci-parent</artifactId>
<name>First CI Friendly</name>
<version>${revision}</version>
...
<properties>
<revision>1.0.0-SNAPSHOT</revision>
</properties>
<modules>
<module>child1</module>
..
</modules>
</project>

子项目类似于:

1
2
3
4
5
6
7
8
9
10
11
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.maven.ci</groupId>
<artifactId>ci-parent</artifactId>
<version>${revision}</version>
</parent>
<groupId>org.apache.maven.ci</groupId>
<artifactId>ci-child</artifactId>
...
</project>

依赖

在多模块项目中,经常会在模块之间互相定义依赖。定义依赖项及其相应版本的常用方法是使用${project.version},并且此方法没有更改。如果尝试使用${revision}替代${project.version},将会在构建时发生错误。

子项目之间的依赖应该像下面这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.maven.ci</groupId>
<artifactId>ci-parent</artifactId>
<version>${revision}</version>
</parent>
<groupId>org.apache.maven.ci</groupId>
<artifactId>ci-child</artifactId>
...
<dependencies>
<dependency>
<groupId>org.apache.maven.ci</groupId>
<artifactId>child2</artifactId>
<!-- 不能使用 ${revision} -->
<version>${project.version}</version>
</dependency>
</dependencies>
</project>

Install / Deploy

安装本地和发布到远程仓库,必须使用flatten-maven-plugin插件。否则安装到仓库的文件无法被maven使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>1.1.0</version>
<configuration>
<updatePomFile>true</updatePomFile>
<flattenMode>resolveCiFriendliesOnly</flattenMode>
</configuration>
<executions>
<execution>
<id>flatten</id>
<phase>process-resources</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
<execution>
<id>flatten.clean</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

注:在使用该插件进行构建时,会在项目目录下增加.flattened-pom.xml文件,该文件为临时文件,在使用版本管理工具时,可以将该文件忽略。