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版本产品上的标准官方的方法? 如春常见的开源软件包和休眠忽略这一版本惯例?
根据该参考 ,Maven的要求版本是这样的形式:
<MajorVersion [> . <MinorVersion [> . <IncrementalVersion ] ] [> - <BuildNumber | Qualifier ]>
凡MajorVersion,MinorVersion,IncrementalVersion和BuildNumber都是数字和限定符是一个字符串。 如果您的版本号不匹配这种格式,那么整个版本号被视为是限定符 。
参考接着解释说,你可以“面子问题”(特别是与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中的较新版本更加灵活。 小:增量:版本范围边界所使用的主要还是评估预选赛方案,因此,如果您使用的版本范围的灵活性是用处不大。
自从3.0版本,Maven使用一个一致的系统来为个人版本和版本范围比较版本号。 目前,该系统使得有很大的意义,一旦你了解一些陷阱。
所有的比较现在所做ComparableVersion ,其中说:
- “的混合
-
”(短划线)和' .
'(点)分离器, - 字符和数字之间的过渡也构成一个分离器:
1.0alpha1
=> [1, 0, alpha, 1]
- 无限数量的版本组件,
- 在文本版本的组件可以是数字或字符串,
- 字符串检查众所周知预选赛和限定词排序用于版本排序。 著名预选赛(不区分大小写)为:
-
alpha
或a
-
beta
或b
-
milestone
或m
-
rc
或cr
-
snapshot
- (空字符串)或
ga
或final
-
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-beta1
或1.0-rc1
,并有Maven的了解,这些都是以后。
还要注意的是1.0-beta-1
是完全相同1.0beta1
,和1.0
是完全相同1
或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-SNAPSHOT
或1.0
,比早期的宁愿以后的项目。 这是通过全面支持mvn versions:resolve
,m2eclipse的等等。
这是被直接写入对测试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
你如何使用主/次/ incremtal /等假设是完全错误的。 在比较中进行ComparableVersion其中包含实现。 该构造函数将调用parseVersion(...)
它使用ComparableVersion
被存储为例如在DefaultArtifactVersion
的过程中,它的使用compareTo(..)
有喜欢的部分getMajor..
等,但这些都无法正常工作。 这就是为什么会的原因被标记弃用 。
通过Stehpen Collony的信息是真实的Maven的2,但没有对Maven 3了。