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>