0

我维护一个开源项目并将其发布到中央存储库。我刚发表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>

版本号在 Maven 中的工作方式声明“所有带有限定符的版本都比没有限定符的相同版本(发行版)旧”。另一个 StackOverflow 问题,Maven 如何对版本号进行排序?,有一个引用ComparableVersion类的答案,该类列出了几个众所周知的限定符(alpha、beta、里程碑、rc 和快照),它们应该比 ga/final(空字符串)版本“更早”排序。

由于在早期版本中使用了自定义限定符,我尝试-m-在我的 java7 版本中使用里程碑限定符 ( ) 向 Maven 表明它应该是比 2.6 更“早”的版本。但是,搜索中央存储库显示该-m-版本是“最新版本”。

我的问题:

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

1 回答 1

3

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

  • 2.6 带分类器:JDK 8 的“jdk8”
  • 2.6 带分类器:“jdk7”等

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

除此之外,我建议基于semver为这种不可抗拒的变化增加主要版本。

此外,您使用 alpha 等引用 ComparableVersion 是 Maven 在内部处理版本的方式。这可以查看该类的单元测试

但是你可以通过一个小命令行工具来检查 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”并创建另一个工件。这些工件应该具有用于​​此类目的的分类器。

于 2016-06-17T07:22:19.503 回答