中央存储库如何对版本号进行排序?

How does the Central Repository sort version numbers?

我维护一个开源项目并将其发布到 The Central Repository。我刚刚发布了 oshi-core-2.6。我的 pom.xml 中该版本的版本控制为:

<groupId>com.github.dblock</groupId>
<artifactId>oshi-core</artifactId>
<version>2.6</version>

由于 Date/Time 函数,我的代码需要 Java 8。为了支持用户的请求,在此版本之前,我发布了一个使用 threeten backport 的 Java 7 兼容版本,其 pom.xml 中包含以下内容:

<groupId>com.github.dblock</groupId>
<artifactId>oshi-core</artifactId>
<version>2.6-m-java7</version>

How Version Numbers Work in Maven states that "All versions with a qualifier are older than the same version without a qualifier (release version)." Another Whosebug question, How does maven sort version numbers?, has an answer citing the ComparableVersion class 列出了几个众所周知的限定符(alpha、beta、milestone、rc 和 snapshot),它们应该排序 "earlier" 而不是 ga/final(空字符串)发布。

由于在早期版本中有自定义限定符,我尝试在我的 java7 版本中使用里程碑限定符 (-m-) 来向 Maven 指示它应该是 "earlier" 比2.6发布。但是,searching the Central Repository 显示 -m- 版本是 "Latest Version".

我的问题:

这是分类器的工作,而不是那种奇怪的版本。

  • 2.6 带分类器:"jdk8" for JDK 8
  • 2.6 带分类器:"jdk7" 等

此外,Oracle 的引用文档对 Maven 2 有效,但对 Maven 3 无效。

除此之外,我建议在 semver 的基础上增加主要版本以应对这种不可抗拒的变化。

此外,您正在使用 alpha 等引用 ComparableVersion,这就是 Maven 内部处理版本的方式。这个可以看一下Unit test for that class.

但是您可以通过一个小命令行工具检查 Maven 的行为:

java -jar apache-maven-3.3.9\lib\maven-artifact-3.3.9.jar 1.0.0 2.0.0
Display parameters as parsed by Maven (in canonical form) and comparison result:
1. 1.0.0 == 1
   1.0.0 < 2.0.0
2. 2.0.0 == 2

通过使用它,您可以看到 Maven 3+ 将 2.6-m-java7 处理为大于 2.6

java -jar apache-maven-3.3.9\lib\maven-artifact-3.3.9.jar 2.6-m-java7 2.6
Display parameters as parsed by Maven (in canonical form) and comparison result:
1. 2.6-m-java7 == 2.6-m-java-7
   2.6-m-java7 > 2.6
2. 2.6 == 2.6

所以这就是中央也将其处理为更大的原因。

因此,如果您使用 rcalpha 之类的东西,您将看到结果:

java -jar apache-maven-3.3.9\lib\maven-artifact-3.3.9.jar 2.6-alpha 2.6
Display parameters as parsed by Maven (in canonical form) and comparison result:
1. 2.6-alpha == 2.6-alpha
   2.6-alpha < 2.6
2. 2.6 == 2.6

java -jar apache-maven-3.3.9\lib\maven-artifact-3.3.9.jar 2.6-rc1 2.6
Display parameters as parsed by Maven (in canonical form) and comparison result:
1. 2.6-rc1 == 2.6-rc-1
   2.6-rc1 < 2.6
2. 2.6 == 2.6

(上述CLI工具自Maven 3.2.5起可用)

最好的解决方案是拥有一个可以生成您常用工件的模块。制作一个包含 JDK 7 配置的补充模块,您可以在那里使用 "threeten backport" 并创建另一个工件。这些工件应该具有用于​​此类目的的分类器。