Maven版本范围,以排除下一个次要版本

Maven版本范围,以排除下一个次要版本,maven,Maven,我正在使用Maven 3.3.3,我想表示我将接受任何2.7.x版本的jackson core依赖项(但在我有机会评估向后兼容性、运行单元/回归测试等之前,我不愿意使用2.8.x) 这将允许我的项目接收bug修复(在增量版本下),但延迟跳转到下一个minor版本,直到准备就绪 我本能地将以下内容写入pom.xml: <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core<

我正在使用Maven 3.3.3,我想表示我将接受任何2.7.x版本的
jackson core
依赖项(但在我有机会评估向后兼容性、运行单元/回归测试等之前,我不愿意使用2.8.x)

这将允许我的项目接收bug修复(在增量版本下),但延迟跳转到下一个
minor
版本,直到准备就绪

我本能地将以下内容写入
pom.xml

<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>[2.7.1,2.8)</version>
这让我大吃一惊,然而,这导致了描述Maven依赖项排序顺序的“官方”

这些帮助我理解了为什么
2.8.0.rc2
被认为比
2.8.0
更“老”

因此,我推断以下方法(尽管有些不切实际)将产生预期的结果: [2.7.1,2.8.0.a)

我错了。
dependency:list
现在生成:

com.fasterxml.jackson.core:jackson-core:jar:2.8.0:compile
与相同的结果(或与
-a
的变体): [2.7.1,2.8.a)

总之,这似乎意味着以下顺序:

2.8.0 < 2.8.0.a 
2.8.0.rc2 < 2.8.0 
2.8.0<2.8.0.a
2.8.0.rc2<2.8.0
所以…如果我在学校学到的关于传递关系的所有知识都是正确的,那么:

2.8.0.rc2 < 2.8.0.a
2.8.0.rc2<2.8.0.a
这似乎与SO的答案相矛盾。同时,Javadoc是不明确的(即,限定符顺序是否列出了实际实现的顺序),并且有点混乱

无论如何,它似乎与字符串排序或“发布候选”(假定的
rc
的意思是在指定为
a
的alpha版本之前)的常识不符

如果发布了一个实际的
2.8.0-alpha
版本,是否会有不同的处理方式

一句话:是否有一种合理的可转移方式来指定Maven版本范围,该范围不包括2.8.0版本空间中的所有内容


编辑:更重要的一点……是否有一个明确的文档记录和公开的Maven版本排序算法描述,而不是源代码?很难说cwiki页面是否是一个理想的规范或实现的(当然没有达到我们在这里探讨的细节级别)Javadoc似乎暗示(但不是毫不含糊地这样说)这里的注释所证明的
-
之间的相等性并非如此。

您可以使用以下命令简单地检查顺序:

java -jar apache-maven-3.3.3/lib/maven-artifact-3.3.3.jar 2.8.0.rc2 2.8.0.a

Display parameters as parsed by Maven (in canonical form) and comparison result:
1. 2.8.0.rc2 == 2.8.0.rc-2
   2.8.0.rc2 < 2.8.0.a
2. 2.8.0.a == 2.8.0.a
马文自己说

此外,考虑到对原始问题的评论中所述,我的结论是,在一个更持久的解决方案范围内说明版本号并不是100%安全、可转让的

实际上,我认为作出假设将使其中任何一项在大多数情况下都是有效的:

[2.7.0,2.8.-alpha.alpha)
[2.7.0,2.7.9999.9999]
但从理论上讲,工件的版本号可能总是较小(在第一种情况下)或较大(在第二种情况下)(请注意
2.7.9999.9999.9>2.7.9999.9999

即使有这些假设,以任何一种方式声明范围都会使生成接受任何发布的
2.7.x
版本,例如
2.7.1-rc2

我知道我在最初的问题中意识到这是一个隐含的前提。也就是说,要求“接收错误修复(在增量版本下),但延迟跳转到下一个次要版本直到准备就绪”假设“增量版本”只是非alpha、非rc等版本

这个前提是无效的。提供“只有不合格的版本(例如,
maj.min.inc
,没有
-qualifier
)”似乎不是Maven支持的用例,完全是一个单独的问题


我认为我现在坚定地站在“Maven Ranges is Evil”阵营中……与其说是为了构建的可复制性,不如说是为了能够控制所包含工件的质量/最终性。

[2.7.1,2.8.0-alpha-alpha)
实现了这个技巧……有点小技巧。遗憾的是,它没有实现这个技巧。
java-jar${Maven home}/lib/maven-artifact-3.3.3.jar 2.8.0-alpha.alpha.2.8.0-alpha-alpha
(参见@khmarbaise答案)说(部分):
2.8.0-alpha.alpha<2.8.0-alpha
…因此有一些东西小于
alpha
(注意
分隔符).这感觉像是打了一个摩尔。它变得更有趣了…
2.8.0-alpha.alpha>2.8.0-alpha.alpha[.-]alpha
因为Maven认为作为版本号一部分的post-fixed限定符的数量似乎没有限制。这看起来越来越像是的副本。当然,h/t到@khmarbaise可供参考和参考。感谢这个工具提示。它显然对运行一些测试用例很有帮助(见别处)。然而,仍然在寻找关于Maven如何订购版本号的规范答案。
java -jar apache-maven-3.3.3/lib/maven-artifact-3.3.3.jar 2.8.0.rc2 2.8.0-alpha
Display parameters as parsed by Maven (in canonical form) and comparison result:
1. 2.8.0.rc2 == 2.8.0.rc-2
   2.8.0.rc2 > 2.8.0-alpha
2. 2.8.0-alpha == 2.8-alpha
[2.7.0,2.8.-alpha.alpha)
[2.7.0,2.7.9999.9999]