maven如何排序版本号?

ams*_*ams 24 maven-3 maven

Maven似乎能够指出一系列版本,例如<version>[1.2.3,)</version>当没有所有开源软件包遵循的一致版本控制方案时,maven如何确定什么是新版本或旧版本.例如

  • JUnit的 4.10
  • SLF4J 1.7.2
  • 过冬 4.1.7.Final
  • 弹簧 3.1.2.RELEASE

maven如何计算maven中包的旧版和新版?如果包使用字母作为A,B,C或A2,A2,A4 ......等版本的数字,该怎么办?

是否应该有标准的官方方式来版本化maven包?像spring和hibernate这样的常见开源软件包是否忽略了这种版本控制惯例?

Jel*_*aby 41

从版本3.0开始,Maven使用一致的系统来比较各个版本和版本范围的版本号.一旦你理解了一些问题,这个系统现在很有意义.

所有比较现在由ComparableVersion完成,其中说:

  • 混合' -'(短划线)和' .'(点)分隔符,
  • 字符和数字之间的转换也构成一个分隔符:1.0alpha1=>[1, 0, alpha, 1]
  • 无限数量的版本组件,
  • 文本中的版本组件可以是数字或字符串,
  • 检查字符串是否为已知的限定符,限定符顺序用于版本排序.众所周知的限定符(不区分大小写)是:
    • alpha 要么 a
    • beta 要么 b
    • milestone 要么 m
    • rc 要么 cr
    • snapshot
    • (空字符串)或gafinal
    • sp
  • 在已知限定符之后考虑未知限定符,具有词法顺序(始终不区分大小写),
  • 破折号通常在限定符之前,并且总是不如前面带点的东西重要.

这意味着版本按以下顺序出现,我认为这是完全合理的,除了中间的1.0-SNAPSHOT:

  • 1.0-beta1-SNAPSHOT
  • 1.0-beta1
  • 1.0-beta2-SNAPSHOT
  • 1.0-rc1-SNAPSHOT
  • 1.0-rc1
  • 1.0-SNAPSHOT
  • 1.0
  • 1.0-sp
  • 1.0-whatever
  • 1.0.1

我在这一切中发现的主要疑难杂症是snapshot之后 beta或者rc,所以你不能有一个开发版本1.0-SNAPSHOT,然后释放1.0-beta11.0-rc1并有Maven的了解,这些都是以后.

另请注意,1.0-beta-1它与or 完全相同1.0beta1,并且1.01or 完全相同1.0.0.

版本范围现在(几乎)按照您期望的方式工作.例如,[1.0-alpha-SNAPSHOT,1.0]会发现1.0-beta1-SNAPSHOT,1.0-beta1,1.0-rc1-SNAPSHOT,1.0-rc1,1.0-SNAPSHOT1.0,宁愿在早期的后项.mvn versions:resolveM2Eclipse等完全支持这一点.

  • Maven版本3.2.0的给定引用不正确,因为Maven版本3.0对此进行了更改。请参阅https://maven.apache.org/ref/3.0/maven-artifact/apidocs/org/apache/maven/artifact/ versioning / ComparableVersion.html (2认同)

Phy*_*yxx 5

这是一个直接针对Maven的ComparableVersion类编写的测试。

package org.codehaus.mojo.buildhelper.versioning;

import org.apache.maven.artifact.versioning.ComparableVersion;
import org.junit.Assert;
import org.junit.Test;

public class TempTest {
    @Test
    public void testVersions() {
        Assert.assertTrue(new ComparableVersion("1.0-beta1-SNAPSHOT").compareTo(
                new ComparableVersion("1.0-beta1")) < 0);
        Assert.assertTrue(new ComparableVersion("1.0-beta1").compareTo(
                new ComparableVersion("1.0-beta2-SNAPSHOT")) < 0);
        Assert.assertTrue(new ComparableVersion("1.0-beta2-SNAPSHOT").compareTo(
                new ComparableVersion("1.0-rc1-SNAPSHOT")) < 0);
        Assert.assertTrue(new ComparableVersion("1.0-rc1-SNAPSHOT").compareTo(
                new ComparableVersion("1.0-rc1")) < 0);
        Assert.assertTrue(new ComparableVersion("1.0-rc1").compareTo(
                new ComparableVersion("1.0-SNAPSHOT")) < 0);
        Assert.assertTrue(new ComparableVersion("1.0-SNAPSHOT").compareTo(
                new ComparableVersion("1.0")) < 0);
        Assert.assertTrue(new ComparableVersion("1.0").compareTo(
                new ComparableVersion("1")) == 0);
        Assert.assertTrue(new ComparableVersion("1.0").compareTo(
                new ComparableVersion("1.0-sp")) < 0);
        Assert.assertTrue(new ComparableVersion("1.0-sp").compareTo(
                new ComparableVersion("1.0-whatever")) < 0);
        Assert.assertTrue(new ComparableVersion("1.0-whatever").compareTo(
                new ComparableVersion("1.0.1")) < 0);
    }
}
Run Code Online (Sandbox Code Playgroud)

此测试断言以下版本被 Maven 视为从低到高:

  • 1.0-beta1-快照
  • 1.0-beta1
  • 1.0-beta2-快照
  • 1.0-rc1-快照
  • 1.0-rc1
  • 1.0-快照
  • 1.0 和 1(它们是相等的)
  • 1.0-sp
  • 1.0-随便
  • 1.0.1