答案https://stackoverflow.com/a/31482463/927493解释了Maven版本的顺序。在https://blog.soebes.de/blog/2017/02/04/apache-maven-how-version-comparison-works/之后,您可以在命令行上比较版本。我得到以下结果:
C:\coprogramme\apache-maven-3.5.0\lib>java -jar maven-artifact-3.5.0.jar 2.0.0 2.0.0-a
Display parameters as parsed by Maven (in canonical form) and comparison result:
1. 2.0.0 == 2
2.0.0 < 2.0.0-a
2. 2.0.0-a == 2-a
C:\coprogramme\apache-maven-3.5.0\lib>java -jar maven-artifact-3.5.0.jar 2.0.0 2.0.0-alpha
Display parameters as parsed by Maven (in canonical form) and comparison result:
1. 2.0.0 == 2
2.0.0 > 2.0.0-alpha
2. 2.0.0-alpha == 2-alpha
在答案以及https://github.com/apache/maven/blob/master/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ComparableVersion.java中的Javadoc之后,alpha
和a
的版本部分应该相等,显然不是这种情况。
有人可以向我解释吗?
答案 0 :(得分:1)
尽管文档说了什么,但看来a
是alpha
的同义词,仅当它紧跟一个数字时。所以
2.0.0-a1
等效于2.0.0-alpha1
和2.0.0-alpha-1
(但不等于2.0.0-alpha.1
)a
,2.0.0-a
或2.0.0-a.1
中的2.0.0-a-1
是“未知限定词”,不等同于2.0.0-alpha-1
,并在所有已知的限定词之后 进行排序出现该行为是因为ComparableVersion
在处理字符串组件的内部类中有两种定义别名的方式:
private static final List<String> QUALIFIERS =
Arrays.asList( "alpha", "beta", "milestone", "rc", "snapshot", "", "sp" );
private static final Properties ALIASES = new Properties();
static
{
ALIASES.put( "ga", "" );
ALIASES.put( "final", "" );
ALIASES.put( "release", "" );
ALIASES.put( "cr", "rc" );
}
// ...
StringItem( String value, boolean followedByDigit )
{
if ( followedByDigit && value.length() == 1 )
{
// a1 = alpha-1, b1 = beta-1, m1 = milestone-1
switch ( value.charAt( 0 ) )
{
case 'a':
value = "alpha";
break;
case 'b':
value = "beta";
break;
case 'm':
value = "milestone";
break;
default:
}
}
this.value = ALIASES.getProperty( value , value );
}
a
,b
和m
的特殊情况,仅在followedByDigit==true
时触发,并且仅在限定符发生时才会发生被下一个数字字符终止。ga
,final
和release
完全等同于空字符串(后者是规范形式),而cr
的规范形式为rc
。这部分的行为符合OP的预期。我猜这是基于观察到的版本使用情况,有时字母实际上是用作版本(例如,OpenSSL用于使用尾随字母或两个来对补丁程序发行进行编号,例如0.9.7m或0.9.8zh),实际上,alpha,beta和里程碑发行版始终具有发行版号,使用简短版本的项目不会在其中添加任何多余的字符:因此a
本身就意味着“ alpha”实际上不会发生。>
可惜没有正确记录!