我正在使用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
之间,这里的评论并非如此。
答案 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”阵营......不仅仅因为构建可重复性原因,而是能够控制所包含文物的质量/完整性。