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

时间:2016-11-28 19:14:41

标签: maven

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

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

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

<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>[2.7.1,2.8)</version>

但是,mvn dependency:list表示使用了以下版本:

com.fasterxml.jackson.core:jackson-core:jar:2.8.0.rc2:compile

我对此感到吃惊,但是挖出this answer导致了“官方”Maven Javadoc,它描述了Maven依赖的排序顺序。

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

所以,我推断以下内容(尽管是hack-ishly)会产生预期的结果:     [2.7.1,2.8.0.a)

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

com.fasterxml.jackson.core:jackson-core:jar:2.8.0:compile

-a的相同结果(或2.8.0 < 2.8.0.a 2.8.0.rc2 < 2.8.0 的变体):     [2.7.1,2.8.a)

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

2.8.0.rc2 < 2.8.0.a

所以......如果我在学校里学到的关于传递关系的一切都是正确的,那么:

rc

这似乎与SO答案相矛盾。同时,Javadoc是不明确的(即,限定符排序列出实际上实现的排序)并且this Apache Wiki / Confluence page有点令人困惑。

无论如何,它似乎与字符串排序或常见意义不一致,即“发布候选者”(假定a的含义在指定为2.8.0-alpha的alpha版本之前)。< / p>

如果已发布实际.版本,是否会以不同方式处理?

结论:是否有一种合理可转换的方式来指定Maven版本范围,它排除了2.8.0版本空间中的所有内容?

编辑:更多底线......是否有明确记录并公开提供的源代码外部版本的版本版本说明?很难判断cwiki页面是否是一个所需的规范或实现(当然不会达到我们在这里探讨的详细程度)而且Javadoc似乎暗示(但并不明确说明)平等在-onChange之间,这里的评论并非如此。

2 个答案:

答案 0 :(得分:1)

您只需使用以下命令检查排序:

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

您还可以通过以下方式检查其他版本2.8.0-alpha

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

答案 1 :(得分:0)

Maven本身说there is no official documentation until this bug is resolved

此外,鉴于对原始问题的评论中所述的内容,我的结论是,在一个更持久的解决方案范围内,没有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没有-qualifer)”似乎不是Maven支持的用例,完全是一个单独的问题。

我认为我现在已经坚定地参与了“Maven Ranges is Evil”阵营......不仅仅因为构建可重复性原因,而是能够控制所包含文物的质量/完整性。