1. 版本管理(version)
说了那么多废话,什么是版本管理?首先,一个健康的项目,通常有一个长期、合理的版本演变过程。版本管理是指项目整体版本的演变过程管理,就比如从1.0-SNAPSHOT --> 1.0 --> 1.1-SNAPSHOT
演变。体现的是从开发快照版到稳定版,继续升级进入下一个版本的快照开发版的过程。(SNAPSHOT 叫快照版)
2. 版本号
2.1 版本号的组成
我们在引入其他依赖的时候,经常看到,比如1.2.1
、1.7
、1.0-SNAPSHOT
、1.1-release
、2.3-alpha
等的 version。但它们的组成比较简单,如下,maven 的版本构成:
<主版本>.<次版本>.<增量版本> - <里程碑版本>
一般情况下,主版本
和次版本
会一直存在,增量版本
和里程碑版本
见到的相对少的多。
主版本: 表示项目的重大架构变化。如struts2
和struts1
采用不同的架构。
次版本: 较大范围功能增加和变化,及 bug 修复,并且不涉及到架构变化的。
增量版本:表示重大 bug 的修复,如果发现项目发布之后,出现影响功能的 bug,及时修复,则应该是增量版本的变化。
里程碑版本:往往表示某个版本的里程碑,经常见到snapshot
,另外还有alpha
、beta
,比如:1.0-SNAPSHOT
、3.0-alpha-1
、1.1.2-beta-2
。
2.2 snapshot 介绍
通常在开发的阶段,你们会在 maven 项目的pom.xml
里看到,当前项目的版本号后边带有SNAPSHOT
, 那它代表什么意思呢?用于什么场景?
snapshot
表示快照版,它不是个稳定版本,属于开发过程中使用的版本。当我们项目处于不停的迭代开发期,如果存在依赖关系,比如 A 项目组开发后发布的新包,被 B 项目组引用,这时候使用快照版本snapshot
,能够在 A 项目组发布到仓库后,自动转为最新时间戳的后缀,供 B 项目组自动引用成功。
这样的好处是,当我们有依赖关系的两个项目组同时开发时,可以互不影响,每次 A 项目组发布后,B 项目组都会刷新、重新编译的方式,自动更新到最新的 A 项目开发的依赖包。只有当准备进入测试阶段,才会将里程碑版本号的SNAPSHOT
替换成alpha
或beta
,即测试版本。
2.3 测试版本alpha
、beta
当一个项目开发完成后,就会进入测试版本,而测试版本一般会分为内部测试 alpha版
、外部测试 beta版
两种。
alpha
和beta
区别就是beta
版会向外公开,而alpha
版不会。
- alpha(α):预览版,或者叫内部测试版;一般不向外部发布,会有很多 Bug;一般只有测试人员使用。
- beta(β):测试版,或者叫公开测试版;这个阶段的版本会一直加入新的功能;在 Alpha 版之后推出。
因为处于测试阶段,肯定会有来回变的情况,那里程碑版本号的排序是怎么排的,它是按照字符串进行比较大小的
, 就比如:1.3-alpha-2
>1.3-alpha-10
。
下边有几个扩展,如下:
扩展一:
α、β、λ 常用来表示软件测试过程中的三个阶段。
-- α(alpha) 是第一阶段,一般只供内部测试使用;
-- β(beta)是第二个阶段,已经消除了软件中大部分的不完善之处,但仍有可能还存
在缺陷和漏洞,一般只提供给特定的用户群来测试使用;
-- λ(lambda)是第三个阶段,此时产品已经相当成熟,只需在个别地方再做进一步的
优化处理即可上市发行。
扩展二:
软件开发版本分类描述
Alpha:软件或系统的内部测试版本,会有很多Bug,仅内部人员使用
Beta:软件或系统的测试版本,这一版本通常是在Alpha版本后,会有很多新功能,同时也有不少Bug
Gamma:软件或系统接近于成熟的版本,只需要做一些小的改进就能发行
RC(Release Candidate):候选版本,这一版本不会增加新功能,多要进行Debug
GA(General Available):正式发布版本,这个版本就是正式的版本
一个介绍的好文章地址: 软件的 Alpha、Beta、GM、RC、GA 等版本到底是啥意思 https://www.bilibili.com/read/cv9270313
2.4 rc、final、stable、release、GA稳定版
当测试通过后,将会进入正式版本,正式版本很多都不一样,但是大概就这几种。大部分的正式版是啥也不带,就一个单纯的版本号,比如1.0
、1.7.1
等。也有个别的是这些 rc
、final
、stable
、release
、GA
等。
正式版本就是稳定版,它在当期内是不会再变化了,表示测试通过,可以对外发布的版本。
正式版本也有排序,它的排序与里程碑版本号排序不同,正式版本就是以数字进行排序
,比如1.10.1
> 1.7.1
> 1.5
。
这里就需要提醒大家,一般我们下依赖,尽量不要下非稳定版本,像那种版本,基本都是有问题的,如果有稳定版,尽量用稳定版。
2.5 看下开源nacos
的版本迭代情况
在学习版本号这块的时候,专门搜了下大厂的版本迭代情况,所以我就搜到了nacos
这个。nacos 源码地址
3. maven指定版本号范围写法
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
上述代码是我们在使用maven依赖某一个jar包时最常见的写法,其中version指定了jar包的版本为1.18.8。但是在一些项目中我们可以看到如下写法:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>[1.18.8,1.18.12]</version>
</dependency>
version的位置变成了中括号加逗号的形式,那这样是什么意思呢?意思是在1.18.8-1.18.12的范围内的jar包都可以使用,默认使用最大版本的即1.18.12
完整的版本号范围说明如下:(x为具体使用的版本号)
(,1.0] x <= 1.0
[1.0] x = 1.0 跟直接指定1.0没有区别
[1.2,1.3] 1.2 <= x <= 1.3
[1.0,2.0) 1.0 <= x < 2.0
[1.5,) x >= 1.5
(,1.0],[1.2,) x <= 1.0 or x >= 1.2
(,1.1),(1.1,) x < 1.1 or x > 1.1 即排除1.1的版本
那么假如此时存在快照版本和非快照版本呢?默认情况下,同版本的快照版本会小于非快照版本。如:
[1.0-SNAPSHOT,1.0] 如果1.0不存在则使用1.0-SNAPSHOT,1.0存在则使用1.0版本
[1.0,1.0-SNAPSHOT] 错误,会提示:Reason: Range defies version ordering