之前有个群友私聊问我,如何快速统一去更改项目中所有的maven版本号,他说之前都是手动一个个去修改,项目一共有30多个maven模块,上次因为漏改了一个,还造成了生产事故。
其实我自己开源项目有的工程也非常多,有的项目连同测试用例模块也能达到个30,40个之多。以前我都是用全局查找替换来操作的,可后来发现,有的时候无脑全局替换也容易替换错,比如项目的版本是1.2.0,想到替换成1.2.1,但是全局无脑替换的时候,会把一些其他的本来是1.2.0的包的版本号也替换成了1.2.1。所以即便是全局替换,也要一个个再check一遍。
那有没有方便又不容易出错的方法呢?
今天推荐2个小技巧,尤其是第二个,多数人不知道,用完之后,我感觉哪怕有100个模块,都不用慌了。
使用versions-maven-plugin
这个插件来完成。
首先在你的主pom文件里定义如下maven插件:
- <build>
- <plugins>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>versions-maven-plugin</artifactId>
- <version>2.3</version>
- </plugin>
- </plugins>
- </build>
-
然后如果你要修改所有模块的版本号,一行命令皆可解决:
- mvn versions:set -DnewVersion=1.2.1
-
如果你后悔更新了,还可以回退:
- mvn versions:revert
-
如果你确定了,则输入提交命令,就完成了:
- mvn versions:commit
-
这种方式修改的,无论你有几个子模块,都可以统一修改。修改后的pom,parent引用,包括子模块之间的引用版本号,都会连同更改的。
是不是特别方便。
其实我之前很多项目,都是用以上这个插件来更新子模块版本号的。
但是之前一段时间,有一个贡献者给我的开源项目提了个pr,用了另外一种方式去修改版本号,这种方式我后来看了下,更加的方便。甚至都不用去输入命令!
这种方式的核心思想使用占位符去统一管理。
主pom里是这样定义的:
子模块引用其他子模块版本也是同样定义:
这个${reversion}
参数在主pom里定义:
- <properties>
- <revision>2.8.5</revision>
- </properties>
-
如果你光这样定义,那么编译是通不过的,你还需要加上一个插件,这个插件的作用是在编译打包时,会自动替换${reversion}占位:
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>flatten-maven-plugin</artifactId>
- <version>1.2.7</version>
- <configuration>
- <updatePomFile>true</updatePomFile>
- <flattenMode>resolveCiFriendliesOnly</flattenMode>
- </configuration>
- <executions>
- <execution>
- <id>flatten</id>
- <phase>process-resources</phase>
- <goals>
- <goal>flatten</goal>
- </goals>
- </execution>
- <execution>
- <id>flatten.clean</id>
- <phase>clean</phase>
- <goals>
- <goal>clean</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
-
做好以上这几步,那么你要修改版本号的时候,只需要在主pom里把reversion修改一次就可以了,不管多少子模块,都可以生效。
其实在日常开发的过程中,我们总希望摆脱一些机械化,无意义的重复操作,使得自己更加高效的方法。如果你觉得在某一方面浪费了太多的精力,那么一定有更加高效简单的办法来解决。