当Maven下面的子模块比较多的时候,每次修改工程的版本号都是一件非常的痛苦的事情,因为子模块都引用了顶级父模块的pom,所以虽然在父模块中定义了工程的版本号,但每个子模块中要显示地指定父模块的版本号,否则无法找到父模块的pom。举例如下:
./pom.xml
./common/pom.xml
Maven Release Plugin中有一个release:update-versions 指令可以自动更新maven工程及子工程的版本号,并且也会自动更新framework.version属性的值,但唯一有问题的是其版本号只能以-SNAPSHOT结尾,即使使用developmentVersion参数指定了不带SNAPSHOT结尾的版本号也不行,如使用
mvn release:update-versions -DautoVersionSubmodules=false -DdevelopmentVersion=1.0.3
命令执行之后,所有的版本号都变成了1.0.3-SNAPSHOT,而不是1.0.3。不过有人hack了代码,在release:update-versions中增加了一个releaseVersion参数,可以设定正式版的版本号,项目地址为:https://github.com/ge0ffrey/maven-release,可以下载下来进行编译使用。
另外还有一个专门用来修改项目版本号的Maven插件:Versions Maven Plugin,使用起来也非常方便,只要在父工程目录下执行下面的命令即可:
mvn versions:set -DnewVersion=1.0.3
后面的版本名称不限于SNAPSHOT类型,可以任意设置,但这个插件最大的问题就是无法自动修改framework.version的属性的值。
另外,在查阅资料的过程中在statck overflow上发现了有人利用Maven AntRun Plugin设置了一个可以交互输入版本号的方式,即创建了一个profile,代码如下:
使用的时候指定profile为change-version即可,为了不使每个子模块都出现input对话框,在执行mvn命令的时候加上 -N 参数。但这种方式依然无法修改framework.version属性的值,如果在antrun中将new-user-version修改为framework.version或者给其赋值的话都无法成功,也就是无法覆盖已经存在的maven的属性值。
综合来说,两种方式都无法完美地实现三个要求,即自动修改父工程及所有子工程的的版本号、版本号不限于SNAPSHOT和自动修改framework.version的属性,现在看来只有重新编译ge0ffrey修改的maven release插件才能满足要求。
参考资料:
MRELEASE-699 release:update-versions should support -DreleaseVersion too
Is there a way to capture user input in maven and assign it to a maven propertty
Input Task