使用Maven插件修改工程版本号

当Maven下面的子模块比较多的时候,每次修改工程的版本号都是一件非常的痛苦的事情,因为子模块都引用了顶级父模块的pom,所以虽然在父模块中定义了工程的版本号,但每个子模块中要显示地指定父模块的版本号,否则无法找到父模块的pom。举例如下:
./pom.xml
com.example.framework
lingseeframework pom 1.0.2-SNAPSHOT

3.0.2-SNAPSHOT


common




com.example.framework
common
${framework.version}


./common/pom.xml
com.example.framework
framework
1.0.2-SNAPSHOT
..
common

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,代码如下:
change-version

validate org.apache.maven.plugins
maven-antrun-plugin
1.7



org.apache.ant
ant
1.8.4


org.codehaus.plexus
plexus-utils
1.5.15




catch-new-version

run
validate





true


org.codehaus.mojo
versions-maven-plugin
2.2


set-new-version

set
validate
false
${new-user-version}



使用的时候指定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

发表评论

电子邮件地址不会被公开。 必填项已用*标注