1. 概述

手动升级 Maven 依赖在大型项目中是个相当繁琐的工作,特别是当项目依赖的库频繁发布新版本时。

本文将介绍 如何利用 Versions Maven Plugin 来自动化管理依赖版本更新

这种方式在构建持续集成(CI)流程时尤其有用:自动升级依赖、运行测试验证兼容性,并根据结果决定是提交更新还是回滚,整个流程可以做到高度自动化。

2. Maven 版本范围语法

在 Maven2 时代,开发者可以通过版本范围语法来指定依赖的版本区间,Maven 会自动在这个范围内选择合适版本进行升级,无需人工干预。

虽然该语法至今仍然有效,并在一些项目中使用,但建议了解即可,不推荐在现代项目中继续使用:

Maven Version Range Syntax

原因在于,通过外部工具控制版本升级比让 Maven 自动选择要更可控、更可靠

2.1. 已废弃的语法

Maven2 还提供了两个特殊版本标识符:LATESTRELEASE

  • 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

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

mvn versions:use-releases

✅ 该命令会自动将 commons-beanutils 的 SNAPSHOT 替换为最新发布的 RELEASE 版本。

5.2. 更新到下一个 RELEASE 版本

使用命令 versions:use-next-releases 可以将所有非 SNAPSHOT 依赖升级到其下一个可用版本

mvn versions:use-next-releases

mvn versions:use-next-releases

✅ 插件会更新 commons-iocommons-lang3commons-beanutils 到下一个版本。

❌ 但会跳过:

  • 被配置排除的 commons-collections4
  • 使用属性变量定义版本的 commons-compress

5.3. 更新到最新 RELEASE 版本

类似地,使用命令 versions:use-latest-releases 可以将依赖升级到最新版本

mvn 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

原始标题:Use the Latest Version of a Dependency in Maven | Baeldung