1. 概述

在本篇文章中,我们将深入探讨 Maven 的版本管理机制。理解这套机制有助于我们弄清楚构建工具是如何选择正确的依赖版本的。

我们会聚焦于 Maven 3 的版本规范,并给出语义化版本(Semantic Versioning)的正确使用建议。

2. Maven 依赖版本控制

在开发过程中,我们常常会遇到一个问题:应该给当前发布的库或包打上什么版本号?

版本号的设计应当清晰明了,使得使用者可以明确知道当前版本是从哪个版本演化而来的。

通常,在一次发布之后,我们还会继续开发。可能会新增功能、优化已有逻辑,或者修复之前未发现的 bug。

有时候我们甚至会同时维护多个版本分支。例如:

  • 一个分支用于添加新功能
  • 另一个分支则专门修复用户反馈的问题

在这种情况下,版本的发布时间顺序可能并不是最合理的排序方式:

maven release cycle

再举个例子:我们可能刚上线了一个带新功能的版本,第二天却需要紧急修复几天前发布的旧版本。

3. Maven 版本规范说明

本节将介绍 Maven 3 的版本排序规则。Maven 2 的规则略有不同,但由于已经停止维护,这里不再赘述。

在 Maven 中,版本号由字母、数字以及两个特殊符号组成:.-,这些符号被称为“前缀”。

为了比较两个版本的大小,Maven 会对版本字符串进行拆分和修剪操作,将其转换为一组有序的“带前缀标记”的序列。

3.1. 拆分(Splitting)

首先,Maven 把版本号当作字符串处理,并以“前缀”作为分割符进行切分:

1.2.3 -> 1, .2, .3
1.2-a -> 1, .2, -a
1a -> 1, -a
1.2.3b -> 1, .2, .3, -b
a-b-0 -> a, -b, -0

⚠️ 注意:数字与非数字之间的转换被视为等价于一个短横线 -

3.2. 修剪(Trimming)

接着,Maven 会移除所有“空标记”。所谓空标记是指:

  • -. 开头;
  • 后面可以跟 0finalga

比如以下这些都属于空标记:

-, -0, .0, -ga, .final

3.3. 版本排序规则

Maven 根据上述生成的标记序列来比较两个版本号。如果两个序列:

  1. 长度不同,则较短的那个会补 .0(如果另一个标记是以点开头)或补 -(如果另一个标记是以短横线开头)。然后按字典序比较;
  2. 前缀相同,则:
    • 若为纯数字,则按自然数大小比较;
    • 否则按字母顺序比较。

此外,还有一些具有特殊含义的标记,它们的优先级如下:

alpha < beta < milestone < rc = cr < snapshot < "" (empty string) = final = ga < sp

如果标记的前缀不同,则排序规则如下:

.qualifier < -qualifier < -number < .number

💡 如果你不确定版本比较的结果,可以使用 Maven 提供的官方工具 Maven Artifact 来验证。例如执行:

java -jar maven-artifact-3.6.0.jar 2.3-SNAPSHOT 2.3

输出如下:

Display parameters as parsed by Maven (in canonical form) and comparison result:
1. 2.3-SNAPSHOT == 2.3-snapshot
   2.3-SNAPSHOT < 2.3
2. 2.3 == 2.3

这表明 2.3-SNAPSHOT 在版本顺序上排在 2.3 之前。

更多细节请参考 Maven 官方文档 - 版本规范

4. 语义化版本控制(Semantic Versioning)

Maven 的版本规范并没有规定我们应该如何命名版本号。为此,我们可以采用业界广泛认可的 语义化版本控制(Semantic Versioning)

它的格式如下:

maven version 2

每个部分的含义如下:

  • X(主版本号):当你做了不兼容的 API 修改时,应递增主版本号,并将次版本号和修订号重置为 0。
  • Y(次版本号):当你新增了向后兼容的功能时,应递增次版本号,并将修订号重置为 0。
  • Z(修订号):当你做了向后兼容的问题修复时,应递增修订号。

✅ 使用语义化版本可以让依赖管理更加清晰,避免因版本混乱导致的兼容性问题。

5. 常见发布修饰符(Qualifiers)

除了基本的版本号之外,我们还可以使用一些常见的修饰符来标识版本状态:

修饰符 含义
alpha, beta 表示该版本处于早期阶段,功能尚未完善
snapshot 表示当前正在开发中的不稳定版本,随时可能变化
eap Early Access Preview,提供给少数用户试用的预览版
rc, cr Release Candidate,发布候选版本,基本稳定但可能还有 bug
release 正式发布版本,功能完整、稳定
m, milestone 里程碑版本,包含大量新功能

⚠️ 注意:一个版本号通常只使用一个修饰符。

6. 总结

本文我们梳理了 Maven 3 的版本排序规则,并推荐使用语义化版本控制来为项目打标签。

如果你对 Maven 的版本机制还有疑问,可以查阅官方文档:Maven 版本规范


📌 小贴士: 合理使用版本号和修饰符,不仅能帮助你自己管理项目,也能让用户更清楚地了解依赖的稳定性与兼容性。


原始标题:A Guide to Maven Versioning | Baeldung

« 上一篇: Java Weekly, 第255期
» 下一篇: JPA 中的多对多关系