Maven持续集成(Continuous integration,简称CI)版本友好管理

从Maven 3.5.0-beta-1 版本开始可以在pom文件中使用 r e v i s i o n 、 {revision}、 revision、{sha1}、${changelist}做为版本的占位符。

一、单module简单使用${revision}的场景
xml 复制代码
<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>

上述项目可以使用如下指令构建项目:

sh 复制代码
mvn -Drevision=1.0.0-SNAPSHOT clean package

随着项目的复杂度增加,上面的方案将会变的很麻烦,因此另外一种解决方案是简单地在pom文件中使用一个属性,如下所示:

xml 复制代码
<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>

现在就可以简单的使用mvn clean package指令对项目进行打包。当然你也可以使用如下指令更改版本:

sh 复制代码
mvn -Drevision=2.0.0-SNAPSHOT clean package

如果希望对版本进行更复杂精细的控制,可以使用 r e v i s i o n 、 {revision}、 revision、{sha1}、${changelist},如下示例:

xml 复制代码
<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版本,只需要使用如下命令即可实现:

sh 复制代码
mvn -Drevision=2.0.0 clean package

如果想定义1.3.1版本,可以通过如下命令实现:

sh 复制代码
mvn -Dchangelist= clean package

或者想发布另一个版本2.7.8:

sh 复制代码
mvn -Drevision=2.7.8 -Dchangelist= clean package
二、多个module设置

父模块module pom定义如下:

xml 复制代码
<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>

子模块如下:

xml 复制代码
<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>

这个时候如果尝试使用 r e v i s i o n 替换 {revision}替换 revision替换{project.version}将会失败。

如果想使用上述设置部署或安装项目,必须使用flatten-maven-plugin 插件,如下:

xml 复制代码
<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>

参考文档:https://maven.apache.org/maven-ci-friendly.html

开源SDK:https://github.com/mingyang66/spring-parent

相关推荐
丘山一郎7 分钟前
Spring 中的IOC控制反转 和DI依赖注入
java·后端·spring
码视野10 分钟前
基于 Spring Boot + Vue3 的【大学英语四六级 (CET-4/6) 作文智能评分与句式润色系统】设计与实现(含PRD/三端高保真源码/大屏)
java·前端·人工智能·spring boot·后端·vue3
MetaLite12 分钟前
Spring-AOP自调用为什么失效-AopContext真能解决吗
java·后端·spring
大模型码小白15 分钟前
AI 对话流性能调优:万级消息的虚拟滚动落地
java·大数据·前端·javascript·人工智能·算法·机器学习
许彰午1 小时前
14-字段级SM4加密与SM2签名
java·低代码·架构
许彰午2 小时前
13-describe元数据输出
java·低代码·架构·状态模式
用户3721574261353 小时前
Java 设置 Word 文档编辑限制并允许指定区域编辑
java
宠友信息4 小时前
社区类源码开发实践中的仿小红书系统技术要点分析
java·spring boot·redis·mysql·uni-app·vue·内容运营
用户3721574261354 小时前
Java 设置 PDF 表单域只读或扁平化
java
luteres5 小时前
Spring学习笔记
java·后端·spring