1. 概述
手动升级 Maven 依赖在大型项目中是个相当繁琐的工作,特别是当项目依赖的库频繁发布新版本时。
本文将介绍 如何利用 Versions Maven Plugin 来自动化管理依赖版本更新。
这种方式在构建持续集成(CI)流程时尤其有用:自动升级依赖、运行测试验证兼容性,并根据结果决定是提交更新还是回滚,整个流程可以做到高度自动化。
2. Maven 版本范围语法
在 Maven2 时代,开发者可以通过版本范围语法来指定依赖的版本区间,Maven 会自动在这个范围内选择合适版本进行升级,无需人工干预。
虽然该语法至今仍然有效,并在一些项目中使用,但建议了解即可,不推荐在现代项目中继续使用:
原因在于,通过外部工具控制版本升级比让 Maven 自动选择要更可控、更可靠。
2.1. 已废弃的语法
Maven2 还提供了两个特殊版本标识符:LATEST
和 RELEASE
。
LATEST
表示寻找最新的版本(包括 SNAPSHOT)RELEASE
表示寻找最新的非 SNAPSHOT 版本
这两个标识符在普通依赖中依然有效,但在插件依赖中已被废弃,主要原因是它们会导致构建结果不可复现,影响 CI 的稳定性。
3. Versions Maven Plugin 简介
Versions Maven Plugin 是目前处理 Maven 依赖版本管理的事实标准工具。
从远程仓库版本比对,到 SNAPSHOT 版本的时间戳锁定,它提供了丰富的命令来满足各种版本管理需求。
接下来,我们将聚焦在几个常用的命令,帮助你完成依赖升级任务。
3.1. 示例依赖配置
我们先来看一个典型的 pom.xml
配置示例:
<dependencies>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.15.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.13.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>${commons-compress-version}</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.1-SNAPSHOT</version>
</dependency>
</dependencies>
<properties>
<commons-compress-version>1.15</commons-compress-version>
</properties>
同时,我们在插件配置中排除一个依赖项,防止其被自动更新:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.7</version>
<configuration>
<excludes>
<exclude>org.apache.commons:commons-collections4</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
4. 显示可更新的依赖
首先,**要查看项目中有哪些依赖可以更新,可以使用命令 versions:display-dependency-updates
**:
mvn versions:display-dependency-updates
✅ 该命令会列出所有可以更新的 RELEASE 版本依赖(包括被排除的 commons-collections4
,因为排除配置只作用于更新阶段,不影响检测)。
⚠️ SNAPSHOT 版本默认不会显示,因为自动更新开发版本容易引发问题。
5. 更新依赖版本
首次运行更新命令时,插件会自动备份 pom.xml
文件为 pom.xml.versionsBackup
。
每次更新都会修改 pom.xml
,但你可以通过以下命令来决定是否保留更改:
mvn versions:commit
:确认更新mvn versions:revert
:撤销更新
5.1. 将 SNAPSHOT 转为 RELEASE
如果你的项目中使用了 SNAPSHOT 版本依赖,可以使用命令检查其是否已发布为 RELEASE 版本,并自动替换:
mvn versions:use-releases
✅ 该命令会自动将 commons-beanutils
的 SNAPSHOT 替换为最新发布的 RELEASE 版本。
5.2. 更新到下一个 RELEASE 版本
使用命令 versions:use-next-releases
可以将所有非 SNAPSHOT 依赖升级到其下一个可用版本:
mvn versions:use-next-releases
✅ 插件会更新 commons-io
、commons-lang3
和 commons-beanutils
到下一个版本。
❌ 但会跳过:
- 被配置排除的
commons-collections4
- 使用属性变量定义版本的
commons-compress
5.3. 更新到最新 RELEASE 版本
类似地,使用命令 versions:use-latest-releases
可以将依赖升级到最新版本:
mvn versions:use-latest-releases
6. 过滤不想要的版本
6.1. 全局忽略特定版本
你可以通过配置文件,使用正则表达式来忽略某些版本:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.7</version>
<configuration>
<rulesUri>http://www.mycompany.com/maven-version-rules.xml</rulesUri>
</configuration>
</plugin>
该配置文件也可以是本地文件:
<rulesUri>file:///home/andrea/maven-version-rules.xml</rulesUri>
规则文件内容示例:
<ruleset comparisonMethod="maven"
xmlns="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0
http://mojo.codehaus.org/versions-maven-plugin/xsd/rule-2.0.0.xsd">
<ignoreVersions>
<ignoreVersion type="regex">.*-beta</ignoreVersion>
</ignoreVersions>
</ruleset>
6.2. 针对特定依赖忽略版本
你也可以为特定依赖配置独立的版本忽略规则:
<ruleset comparisonMethod="maven"
xmlns="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0
http://mojo.codehaus.org/versions-maven-plugin/xsd/rule-2.0.0.xsd">
<rules>
<rule groupId="com.mycompany.maven" comparisonMethod="maven">
<ignoreVersions>
<ignoreVersion type="regex">.*-RELEASE</ignoreVersion>
<ignoreVersion>2.1.0</ignoreVersion>
</ignoreVersions>
</rule>
</rules>
</ruleset>
7. 总结
通过 Versions Maven Plugin,我们可以:
✅ 安全、自动地检查依赖更新
✅ 控制哪些依赖可以升级,哪些不可以
✅ 灵活过滤不想要的版本(如 beta、alpha)
✅ 自动将 SNAPSHOT 升级为 RELEASE
✅ 在 CI 系统中实现依赖自动更新流程
如需实战演练,可下载示例项目,在终端运行:
./run-the-demo.sh