前言
起因是这样,前段时间,领导提了一个需求:在代码部署的时候,动态指定具体的版本号。
说实话,刚开始我是有点儿困惑的,但是出于对这种机制的好奇,研究了一下。
下面的文章,我们分为两个部分来介绍:
- 修改父子项目的版本依赖
- 修改当前项目的版本号
当然,写文的主要目的还是如何动态修改父项目的版本号,至于如何修改当前项目版本的部分,只是作为一个对比参照。
maven的父子项目结构,在日常开发过程中,常用的有两种:
- 平行结构,父子项目在同一个目录下面;
- 树形结构,子项目在父项目目录之下;
图示:
revision方案
从Maven 3.5.0-beta-1版本开始,可以使用{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
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
更新父项目版本
注意,父版本的更新,是从库里下载最新的release版本进行替换。
父项目有四个release版本,如下:
- 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>
如果指定父版本号,可以看到还是取的最新release版本,DparentVersion参数并没有生效。
- mvn versions:update-parent -DparentVersion=release-1.0.1
versions插件参数介绍
到官方网站可以查看更多使用方法:www.mojohaus.org/versions-ma…