Central Repository如何排序版本号?

时间:2016-06-17 01:15:55

标签: maven versioning maven-central

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

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

由于日期/时间功能,我的代码需要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表示“所有带限定符的版本都比没有限定符的版本(发布版本)旧。”另一个StackOverflow问题How does maven sort version numbers?有一个答案,引用了ComparableVersion类,其中列出了几个众所周知的限定词(alpha,beta,里程碑,rc和快照),这些限定符应该比“早期”排序ga / final(空字符串)发布。

由于在早期版本中有一个自定义限定符,我尝试在我的java7版本中使用里程碑限定符(-m-)来向Maven表明它应该是一个比2.6更早的版本。但是,searching the Central Repository表示-m-版本是“最新版本”。

我的问题:

  • 为什么中央存储库排序与我上面链接的文档排序不匹配?
    • 是否使用Maven排序的早期版本(3.2之前版本)?如果是这样,我可以期待什么一致的“最新版本”排序?
    • 我的工件名称中的连字符是否有影响?
  • 是否有更好的方式以两种格式发布相同的版本号,而不是我选择的方式(显然很差)?

1 个答案:

答案 0 :(得分:3)

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

  • 2.6 with classifier:&#34; jdk8&#34;对于JDK 8
  • 2.6 with classifier:&#34; jdk7&#34;等

此外,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配置的补充模块,你可以使用&#34; threeten backport&#34;并创建一个其他工件。这些工件应该有用于此类目的的分类器。