如何行家排序版本号?(How does maven sort version numbers?)

2019-06-18 13:50发布

Maven的似乎已经表明了一系列版本的能力,如<version>[1.2.3,)</version>如何行家弄清楚什么是新的还是旧版本的时候,没有统一的版本控制方案,所有开源包遵循。 例如

  • JUnit的4.10
  • SLF4J 1.7.2
  • 休眠4.1.7.Final
  • 春天3.1.2.RELEASE

行家如何计算什么是旧主场迎战行家一包的更新的版本? 如果什么包使用字母数字版本沿东西A,B,C或A2,A2,A4 ......等的线

是否有应该是在Maven版本产品上的标准官方的方法? 如春常见的开源软件包和休眠忽略这一版本惯例?

Answer 1:

根据该参考 ,Maven的要求版本是这样的形式:

<MajorVersion [> . <MinorVersion [> . <IncrementalVersion ] ] [> - <BuildNumber | Qualifier ]>

MajorVersion,MinorVersion,IncrementalVersionBuildNumber都是数字和限定符是一个字符串。 如果您的版本号不匹配这种格式,那么整个版本号被视为是限定符

参考接着解释说,你可以“面子问题”(特别是与Maven版本范围),如果你不遵循这个版本计划文物工作。 纵观Maven的源代码是从文章中链接是非常有帮助的。

你给的例子中,Hibernate和Spring的文物似乎在其使用的偏离“而不是”“ . - ”在预选赛中分离出来。

对我而言有些实验表明, DefaultArtifactVersion如上述那样准确解析的版本号。 也就是说,鉴于(Spring的例子3.1.2.RELEASE )将被解释为:

  • 专业: 0
  • 辅修: 0
  • 增量: 0
  • 预选赛: 3.1.2.RELEASE

两个版本号的更重要的是比较 (如果使用Maven 3.0或更新版本) 灵活得多 。 版本号被分成项目列表(其中任一.-标志着项目之间的边界,注意.具有更高的优先级比- 比较然后通过取每个项目在术语和执行自然​​顺序比较完成的。 因此3.1.2.RELEASE将被视为小于3.1.3.RELEASE 。 字符串是太相比,因此3.1.2.RELEASD将被视为小于3.1.2.RELEASE 。 还有一些特殊的字符串具有特殊等价物,例如3.1.3.a.1将整理一样3.1.3.alpha.1

然而,虽然比较 Maven中的较新版本更加灵活。 小:增量:版本范围边界所使用的主要还是评估预选赛方案,因此,如果您使用的版本范围的灵活性是用处不大。



Answer 2:

自从3.0版本,Maven使用一个一致的系统来为个人版本和版本范围比较版本号。 目前,该系统使得有很大的意义,一旦你了解一些陷阱。

所有的比较现在所做ComparableVersion ,其中说:

  • “的混合- ”(短划线)和' . '(点)分离器,
  • 字符和数字之间的过渡也构成一个分离器: 1.0alpha1 => [1, 0, alpha, 1]
  • 无限数量的版本组件,
  • 在文本版本的组件可以是数字或字符串,
  • 字符串检查众所周知预选赛和限定词排序用于版本排序。 著名预选赛(不区分大小写)为:
    • alphaa
    • betab
    • milestonem
    • rccr
    • 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 betarc ,所以你不能有一个开发版本1.0-SNAPSHOT ,然后释放1.0-beta11.0-rc1 ,并有Maven的了解,这些都是以后。

还要注意的是1.0-beta-1是完全相同1.0beta1 ,和1.0是完全相同11.0.0

版本范围现在的工作(几乎)你所希望的方式了。 例如, [1.0-alpha-SNAPSHOT,1.0]会发现1.0-beta1-SNAPSHOT1.0-beta11.0-rc1-SNAPSHOT1.0-rc11.0-SNAPSHOT1.0 ,比早期的宁愿以后的项目。 这是通过全面支持mvn versions:resolve ,m2eclipse的等等。



Answer 3:

这是被直接写入对测试ComparableVersion从Maven的类。

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);
    }
}

这个测试断言,以下版本被认为是从最低至最高的Maven:

  • 1.0-β1-SNAPSHOT
  • 1.0-β1
  • 1.0-β2-SNAPSHOT
  • 1.0-RC1-SNAPSHOT
  • 1.0-RC1
  • 1.0-SNAPSHOT
  • 1.0和1(它们是相等的)
  • 1.0-SP
  • 1.0什么
  • 1.0.1


Answer 4:

你如何使用主/次/ incremtal /等假设是完全错误的。 在比较中进行ComparableVersion其中包含实现。 该构造函数将调用parseVersion(...)它使用ComparableVersion被存储为例如在DefaultArtifactVersion的过程中,它的使用compareTo(..)

有喜欢的部分getMajor..等,但这些都无法正常工作。 这就是为什么会的原因被标记弃用 。

通过Stehpen Collony的信息是真实的Maven的2,但没有对Maven 3了。



文章来源: How does maven sort version numbers?
标签: maven maven-3