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就可以查看该文件内容。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。