Maven版本订购Alpha和A

时间:2019-04-29 09:47:05

标签: java maven

答案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之后,alphaa的版本部分应该相等,显然不是这种情况。

有人可以向我解释吗?

1 个答案:

答案 0 :(得分:1)

尽管文档说了什么,但看来aalpha 的同义词,仅当它紧跟一个数字时。所以

  • 2.0.0-a1等效于2.0.0-alpha12.0.0-alpha-1(但不等于2.0.0-alpha.1
  • a2.0.0-a2.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 );
}
  1. 单字母限定符abm的特殊情况,仅在followedByDigit==true时触发,并且仅在限定符发生时才会发生被下一个数字字符终止。
  2. 别名列表:gafinalrelease完全等同于空字符串(后者是规范形式),而cr的规范形式为rc。这部分的行为符合OP的预期。

我猜这是基于观察到的版本使用情况,有时字母实际上是用作版本(例如,OpenSSL用于使用尾随字母或两个来对补丁程序发行进行编号,例如0.9.7m或0.9.8zh),实际上,alpha,beta和里程碑发行版始终具有发行版号,使用简短版本的项目不会在其中添加任何多余的字符:因此a本身就意味着“ alpha”实际上不会发生。

可惜没有正确记录!