中央存储库如何对版本号进行排序?
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".
我的问题:
- 为什么中央存储库排序与我上面链接的记录排序不匹配?
- 是否使用了较早版本(pre-3.2)的 Maven 排序?如果是这样,我可以期待什么样的一致 "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
所以这就是中央也将其处理为更大的原因。
因此,如果您使用 rc
或 alpha
之类的东西,您将看到结果:
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" 并创建另一个工件。这些工件应该具有用于此类目的的分类器。
我维护一个开源项目并将其发布到 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".
我的问题:
- 为什么中央存储库排序与我上面链接的记录排序不匹配?
- 是否使用了较早版本(pre-3.2)的 Maven 排序?如果是这样,我可以期待什么样的一致 "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
所以这就是中央也将其处理为更大的原因。
因此,如果您使用 rc
或 alpha
之类的东西,您将看到结果:
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" 并创建另一个工件。这些工件应该具有用于此类目的的分类器。