我维护一个开源项目并将其发布发布到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-
版本是“最新版本”。
我的问题:
答案 0 :(得分:3)
这是分类器的工作,而不是那种奇怪的版本。
此外,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配置的补充模块,你可以使用&#34; threeten backport&#34;并创建一个其他工件。这些工件应该有用于此类目的的分类器。