【问题标题】:Maven version ordering for alpha and aalpha 和 a 的 Maven 版本排序
【发布时间】:2019-09-17 22:13:16
【问题描述】:

答案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 应该是相等的,显然情况并非如此。

谁能给我解释一下?

【问题讨论】:

    标签: java maven


    【解决方案1】:

    不管文档怎么说,a 似乎是alpha 的同义词只有当它紧跟一个数字时。所以

    • 2.0.0-a1 等价于2.0.0-alpha12.0.0-alpha-1(但不是2.0.0-alpha.1
    • 2.0.0-a2.0.0-a.12.0.0-a-1 中的a 是“未知限定符”, 等同于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”从未真正出现过。

    很遗憾没有正确记录!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-22
      • 2016-02-26
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      相关资源
      最近更新 更多