Maven父子项目,动态修改POM版本号

1,629 阅读2分钟

前言

起因是这样,前段时间,领导提了一个需求:在代码部署的时候,动态指定具体的版本号。
说实话,刚开始我是有点儿困惑的,但是出于对这种机制的好奇,研究了一下。
下面的文章,我们分为两个部分来介绍:

  • 修改父子项目的版本依赖
  • 修改当前项目的版本号

当然,写文的主要目的还是如何动态修改父项目的版本号,至于如何修改当前项目版本的部分,只是作为一个对比参照。

maven的父子项目结构,在日常开发过程中,常用的有两种:

  • 平行结构,父子项目在同一个目录下面;
  • 树形结构,子项目在父项目目录之下;

图示:
image.png


revision方案

从Maven 3.5.0-beta-1版本开始,可以使用revision,{revision}, {sha1} and/or ${changelist} 这样的变量作为版本占位符。
测试下来,revision方案只能用于树形结构,如果在平行结构中使用,会提示revision参数异常,不能找到指定的版本。

父项目的pom文件片段,注意版本号,这里写的是一个变量:${revision}

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="...">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>assemble-module</artifactId>
    <version>${revision}</version>
    <name>assemble-module</name>
    <packaging>pom</packaging>
</project>

子项目中的pom片段,在这里,同样指定了${revision}变量,表示为指定确切的父项目版本号。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="...">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>assemble-module</artifactId>
        <version>${revision}</version>
    </parent>
    <artifactId>goods</artifactId>
    <version>0.0.11111-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>goods</name>
</project>

打包时,指定具体的版本参数:-Drevision,完整命令如下:

  • mvn -U clean package -pl goods -am -Dmaven.test.skip=true -Drevision=0.0.2-SNAPSHOT

image.png


Maven插件

maven插件【versions-maven-plugin】,官网介绍:www.mojohaus.org/versions-ma… ,是一个通用的版本管理方案,在上述两种情况中都可以使用。
如果想要在平行结构中,也动态指定父项目版本号,则可以使用此插件。平行结构中,父项目已经deploy到远程版本库中,所以父项目的pom文件,这里就不作展示了。

子项目pom文件片段

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="...">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>parent</artifactId>
        <version>dev-0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>goods</artifactId>
    <version>dev-0.0.1-SNAPSHOT</version>
    <name>goods</name>
</project>

更新子项目版本

  • mvn versions:set -DnewVersion=test-0.2.1-SNAPSHOT

image.png

更新父项目版本

注意,父版本的更新,是从库里下载最新的release版本进行替换。
父项目有四个release版本,如下:
image.png

  • mvn versions:update-parent

执行完成之后,pom文件会被更新,注意父项目版本号。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="...">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example</groupId>
        <artifactId>parent</artifactId>
        <version>release-2.0.1</version>
    </parent>
    <artifactId>goods</artifactId>
    <version>dev-0.0.1-SNAPSHOT</version>
    <name>goods</name>
</project>

image.png

如果指定父版本号,可以看到还是取的最新release版本,DparentVersion参数并没有生效

  • mvn versions:update-parent -DparentVersion=release-1.0.1

image.png

versions插件参数介绍

到官方网站可以查看更多使用方法:www.mojohaus.org/versions-ma…

image.png