β

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

Java堂 466 阅读

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

  1. <project>
  2. <groupId>com.example.framework</groupId>
  3. <artifactId>lingseeframework</artifactId>
  4. <packaging>pom</packaging>
  5. <version>1.0.2-SNAPSHOT</version>
  6. <properties>
  7. <framework.version>3.0.2-SNAPSHOT</framework.version>
  8. </properties>
  9. <modules>
  10. <module>common</module>
  11. </modules>
  12. <dependencyManagement>
  13. <dependencies>
  14. <dependency>
  15. <groupId>com.example.framework</groupId>
  16. <artifactId>common</artifactId>
  17. <version>${framework.version}</version>
  18. </dependency>
  19. </dependencies>
  20. </dependencyManagement>
  21. </project>

./common/pom.xml

  1. <project>
  2. <parent>
  3. <groupId>com.example.framework</groupId>
  4. <artifactId>framework</artifactId>
  5. <version>1.0.2-SNAPSHOT</version>
  6. <relativePath>..</relativePath>
  7. </parent>
  8. <artifactId>common</artifactId>
  9. </project>

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

  1. <project>
  2. <profile>
  3. <id>change-version</id>
  4. <build>
  5. <defaultGoal>validate</defaultGoal>
  6. <plugins>
  7. <plugin>
  8. <groupId>org.apache.maven.plugins</groupId>
  9. <artifactId>maven-antrun-plugin</artifactId>
  10. <version>1.7</version>
  11. <dependencies>
  12. <!-- Using org.apache.ant:ant:1.8.4 to avoid https://issues.apache.org/bugzilla/show_bug.cgi?id=51161 -->
  13. <dependency>
  14. <groupId>org.apache.ant</groupId>
  15. <artifactId>ant</artifactId>
  16. <version>1.8.4</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.codehaus.plexus</groupId>
  20. <artifactId>plexus-utils</artifactId>
  21. <version>1.5.15</version>
  22. </dependency>
  23. </dependencies>
  24. <executions>
  25. <execution>
  26. <id>catch-new-version</id>
  27. <goals>
  28. <goal>run</goal>
  29. </goals>
  30. <phase>validate</phase>
  31. <configuration>
  32. <target>
  33. <!-- http://ant.apache.org/manual/Tasks/input.html -->
  34. <input message="请输入新的版本(当前版本:${project.version})" addproperty="new-user-version" defaultvalue="${project.version}" />
  35. </target>
  36. <!-- 将ant中的属性应用到maven中 -->
  37. <exportAntProperties>true</exportAntProperties>
  38. </configuration>
  39. </execution>
  40. </executions>
  41. </plugin>
  42. <plugin>
  43. <groupId>org.codehaus.mojo</groupId>
  44. <artifactId>versions-maven-plugin</artifactId>
  45. <version>2.2</version>
  46. <executions>
  47. <execution>
  48. <id>set-new-version</id>
  49. <goals>
  50. <goal>set</goal>
  51. </goals>
  52. <phase>validate</phase>
  53. <configuration>
  54. <generateBackupPoms>false</generateBackupPoms>
  55. <newVersion>${new-user-version}</newVersion>
  56. </configuration>
  57. </execution>
  58. </executions>
  59. </plugin>
  60. </plugins>
  61. </build>
  62. </profile>
  63. </profiles>
  64. </project>

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

Related Posts:

作者:Java堂
荣辱不惊闲看庭前花开花谢,去留无意漫随天外云卷云舒。——马寅初
原文地址:使用Maven插件修改工程版本号, 感谢原作者分享。

发表评论