我的目标是发布一个具有单一依赖关系的项目。我有一个nexus存储库,我可以部署快照和发布版本。
我有一个依赖
group:artifact:1.1.0-SNAPSHOT
以下候选发布版本在我的nexus repo中发布
group:artifact:1.1.0-RC1
当要求版本插件解决依赖关系时,它声称没有新的依赖项可用。所以他考虑那个
1.1.0-SNAPSHOT > 1.1.0-RC1
但是,如果在我的项目中,我有版本1.0.0-SNAPSHOT,版本1.1.0-RC1将被解析为最新版本。
我错过了什么? (我查看了插件来源,我们有以下代码段:
String otherQualifier = otherVersion.getQualifier();
if ( otherQualifier != null )
{
if ( ( qualifier.length() > otherQualifier.length() )
&& qualifier.startsWith( otherQualifier ) )
{
// here, the longer one that otherwise match is considered older
result = -1;
}
else if ( ( qualifier.length() < otherQualifier.length() )
&& otherQualifier.startsWith( qualifier ) )
{
// here, the longer one that otherwise match is considered older
result = 1;
}
else
{
result = qualifier.compareTo( otherQualifier );
}
}
这对我来说似乎有些不对劲。有什么想法吗?
答案 0 :(得分:9)
Maven版本号包含如下:
<major version>.<minor version>.<incremental version>-<qualifier>
如果所有版本号都相同,则按字母顺序比较限定符。 “RC1”和“SNAPSHOT”并且与“a”和“b”的排序没有区别。因此,“SNAPSHOT”被认为是更新的,因为它按字母顺序更大。请参阅this page作为参考。
请注意,a.b.c-RC1-SNAPSHOT
将被视为早于a.b.c-RC1
。
我不确定该解决方案的建议 - 这就是Maven版本控制的工作原理。
答案 1 :(得分:1)
规范仅适用于major.minor.increment-qualifier,并且通过lexigographical顺序进行比较,独立于beeing snapshot或其他任何内容。
我最终分配了maven-versions-plugin并实现了我自己的版本方案,该方案认为候选版本的快照版本总是比版本候选版本本身更早。
这个实现起来并不太难,我从
扩展而来org/codehaus/mojo/versions/ordering/MavenVersionComparator
并由
org/codehaus/mojo/versions/ordering/VersionComparators.java
并实施了我自己的业务逻辑
答案 2 :(得分:0)
截至 https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm
<块引用>所有带有限定符的版本都比没有限定符的同一个版本(发布版本)旧。
例如:
1.2-beta-2 比 1.2 旧。
使用基本字符串比较来比较具有不同限定符字段的相同版本。
例如:
1.2-beta-2 比 1.2-alpha-6 新。
和
<块引用>Maven 对待 SNAPSHOT 限定符的方式与其他所有限定符不同。如果版本号后跟 -SNAPSHOT,则 Maven 会将其视为相关 MajorVersion、MinorVersion 或 IncrementalVersion 的“尚未发布”版本。