Maven CI 友好版本
从 Maven 3.5.0-beta-1 开始,您可以使用${revision}
,${sha1}
和/或${changelist}
作为 pom 文件中版本的占位符。
单一项目设置
这看起来像这样:
<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>
这当然是一个简单的情况,我们只是${revision}
为了简洁来展示一般课程。
基于上面的 pom,您可以使用以下命令构建您的项目:
mvn clean package
但是等等有问题吗?工件将具有哪个版本?所以你需要为你的工件定义版本。第一种可能性是像这样使用命令行:
mvn -Drevision=1.0.0-SNAPSHOT clean package
随着时间的推移,这将变得很麻烦。因此,另一个解决方案是简单地使用 pom 文件中的一个属性,如下所示:
<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>
</project>
所以现在你可以像往常一样简单地调用 Maven,比如mvn clean package
.
您当然可以通过命令行更改版本,如下所示:
mvn -Drevision=2.0.0-SNAPSHOT clean package
当然,您可以为此使用该.mvn/maven.config
文件。
关于使用的属性的注释。您只能使用那些命名
${revision}
的,${sha1}
和/或${changelist}
而不是其他命名的属性,如下所示:
<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-${buildNumber}-SNAPSHOT</revision>
</properties>
</project>
上面的示例将无法按预期工作。如果您想拥有更大的灵活性,您可以使用不同属性的组合,如下所示:
<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}${sha1}${changelist}</version>
...
<properties>
<revision>1.3.1</revision>
<changelist>-SNAPSHOT</changelist>
<sha1/>
</properties>
</project>
如果你想制作一个版本,2.0.0-SNAPSHOT
这可以简单地通过使用这个来实现:
mvn -Drevision=2.0.0 clean package
另一个使用示例是发布可以通过(版本 1.3.1)完成的发布:
mvn -Dchangelist= clean package
或者,如果您想发布另一个版本:
mvn -Drevision=2.7.8 -Dchangelist= clean package
请阅读本文档直到结束!
多模块设置
所以现在让我们看看我们有一个多模块构建的情况。我们有一个父 pom 和一个或多个孩子。父 pom 将如下所示:
<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>
孩子会是这样的:
<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>
多模块构建当然可以与单个项目设置相同的方式构建。您应该通过父级中的属性或使用.mvn/maven.config
文件来定义版本。
依赖项
在多模块构建中,您经常会定义模块之间的依赖关系。定义依赖关系及其适当版本的常用方法是使用${project.version}
,并且没有改变。
因此,在以下示例中可以看到执行此类操作的正确方法:
<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>
孩子会是这样的:
<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>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
如果您尝试使用${revision}
而不是${project.version}
您的构建将失败。
安装/部署
如果您想使用上述设置安装或部署工件,则 必须使用flatten-maven-plugin否则您将在存储库中安装/部署工件,这些工件将不再被 Maven 使用。这种设置将如下所示:
<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>
<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>
<modules>
<module>child1</module>
..
</modules>
</project>