versions插件 配置构件版本
我们在实际开发中,经常遇到类似这样的情况,同样一份代码,在测试环境我们需要它的Maven版本为1.0-SNAPSHOT,而生产环境则是1.0,这样也便于进行区分打包环境的依赖管理。我们知道Maven中,构件的版本是配置在pom.xml文件中的,那么为了满足测试环境和生产环境分开版本的要求,我们难道要在上线前单独进行一次修改版本的提交吗?当然不需要,我们在Jenkins流水线上打包时,调用versions-maven-plugin可以解决这个问题。
官方文档:https://www.mojohaus.org/versions-maven-plugin/index.html
引入插件
我们可以在pom.xml中按如下配置引入插件。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.10.0</version>
</plugin>
修改构件版本
执行类似如下命令,即可将pom.xml的版本字段修改为1.0。
mvn versions:set -DnewVersion=1.0
可选参数:
-DprocessAllModules=true:修改所有子模块,默认为true-DgenerateBackupPoms=true:生成备份pom,默认为true
如果需要连同依赖工程一起更新,pom.xml中可以考虑使用${project.version}变量统一版本。修改后,再执行类似mvn package等命令,我们打包的构件版本就是新的了。
注意:该操作会修改配置文件pom.xml的内容,为了区分环境,我们一般不会把这个修改提交到版本控制系统,而是在专门打包的服务器上运行versions插件。
修改依赖版本
versions插件也支持单独修改依赖版本。依赖版本修改分为两种情况,一种是定义在<properties>中的版本,另一种则是定义在<dependency>中<version>字段的版本。下面是一个修改<properties>中定义的版本号例子,这种方式最为常用。下面例子中,原pom.xml如下。
<jedis.version>2.9.3</jedis.version>
我们执行如下命令即可将其版本信息修改。
mvn versions:set-property -Dproperty=jedis.version -DnewVersion=4.2.3
下面是修改<version>字段的版本号例子,原pom.xml如下。
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.0</version>
</dependency>
执行如下命令修改该版本号。
mvn versions:use-dep-version -Dincludes=org.apache.poi:poi -DdepVersion=5.2.2
其中-Dincludes指定了依赖的<groupId>:<artifactId>,-DdepVersion指定了新的依赖版本。
观察版本修改效果
对于多模块Maven工程尤其是有多层模块嵌套的复杂历史遗留项目,我们修改工程或模块版本时要尤为谨慎,因为模块之间可能有复杂的版本变量引用关系如${project.version}等,可能改动一个模块的版本就会引起一连串的构件版本变化。其实我们可以通过Effective POM来查看修改的效果,而不用一次次缓慢的编译验证。
Effective POM文件包含最终Maven遵照执行的POM,各种变量都会被替换成确定值,以下命令能够直接输出工程的EffectivePOM文件。
mvn help:effective-pom -Doutput=EffectivePom.xml
除此之外,大多数IDE也都支持Effective POM查看,如下图为Eclipse的Maven文件编辑器,我们切换到Effective POM就可以查看该文件内容。
