31

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

  • 朱尼特4.10
  • slf4j1.7.2
  • 休眠4.1.7.Final
  • 春天3.1.2.RELEASE

maven 如何计算 maven 中旧版本和新版本的包?如果包使用字母作为版本号,如 A、B、C 或 A2、A2、A4 等。

是否应该有标准的官方方式来在 Maven 中版本包?常见的开源软件包,如 spring 和 hibernate 是否忽略了这个版本控制约定?

4

3 回答 3

51

从 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

我在这一切中发现的主要问题是snapshotor之后 所以你不能有一个开发版本,然后发布or并且让 Maven 明白那些是后来的。betarc1.0-SNAPSHOT1.0-beta11.0-rc1

另请注意,1.0-beta-1与 完全相同1.0beta1,并且与or1.0完全相同。11.0.0

版本范围现在(几乎)也可以按照您期望的方式工作。例如,[1.0-alpha-SNAPSHOT,1.0]将找到1.0-beta1-SNAPSHOT1.0-beta11.0-rc1-SNAPSHOT、或1.0-rc1,更喜欢后面的项目而不是前面的项目。M2Eclipse 等完全支持这一点。1.0-SNAPSHOT1.0mvn versions:resolve

于 2015-07-17T18:32:17.717 回答
6

这是一个直接针对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);
    }
}

该测试断言以下版本被 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
于 2017-11-02T00:52:53.210 回答
2

您关于使用主要/次要/增量/等的假设是完全错误的。比较在包含实现的ComparableVersion中完成。ctor 将调用parseVersion(...)which uses which uses ComparableVersionwhich is stored as instance in DefaultArtifactVersionand it's used during thecompareTo(..)

有诸如getMajor..等之类的部分,但这些部分无法正常工作。这就是为什么会被标记为 deprecated的原因。

Stehpen Collony 提供的信息适用于 Maven 2,但不再适用于 Maven 3。

于 2017-05-18T11:08:39.143 回答