Maven 版本管理
本節(jié)中,我們來介紹一下 Maven 是如何進行版本管理的。如何在項目的實際開發(fā)中,結(jié)合 Maven 來推進項目的進行。一個正常的項目的開發(fā)周期通常是很長的,這個過程當(dāng)中,需要發(fā)布很多個版本,那這些版本如何表示,而我們又應(yīng)該如何來管理這些版本呢?
1. 什么是版本管理
那什么是版本管理呢?首先,版本管理是不同于版本控制的。版本控制通常的概念是在軟件開發(fā)過程中,管理程序文件,配置文件等文件的變化。更傾向于來追蹤一個項目過程中,不同時期項目的變化。但是,版本管理則不同,通常是指一個項目過程中,不同時期版本的演化過程。通俗一點講,版本管理就像人的成長過程中,從嬰兒到少年到青年到中年一直到老年這個演變過程的管理;版本控制則更關(guān)注細節(jié),例如這個時期,身高從 160cm 長到了 165cm,或者體重 60kg 變?yōu)榱?62kg 等等。
2. 約定版本號
我們理解了什么是版本管理,那 Maven 是如何做的呢?
通常情況下,Maven 的版本號約定中包括如下幾個部分:
<主版本號>.<次版本號>.<增量版本號>.<里程碑版本號>
- 主版本號:主版本號表示該項目的重大升級。例如:Maven1 到 Maven2;
- 次版本號:表示在該主版本下,較大范圍的升級或變化。例如:Maven-3.0 到 Maven-3.1;
- 增量版本號:增量版本通常是用來修復(fù)bug的版本。例如:Maven-3.1.1;
- 里程碑版本號:用來標(biāo)記里程碑版本。例如:Maven-3.0-alpha-3。
由于 Maven 已經(jīng)維護了將近 20 年,所以,使用 Maven 這個項目的版本演變過程來舉例是再合適不過了。我們打開 Maven 的官網(wǎng),找到 Release Notes,打開便可以看到 Maven 從最開始的版本是如何演變成現(xiàn)在的模樣的。(這里由于存在太多版本,所以,我們只截取了其中一部分)
注意: 有的同學(xué)可能會問,里程碑版本里面的 alpha,beat 是什么意思?
- alpha 版本: alpha 版本被稱為是內(nèi)測版本。通常會存在比較多 bug,主要是面向測試人員使用;
- beat 版本: 這個版本也是測試版本。會比 alpha 版本新增加一些功能;
- RC 版本: 即將發(fā)布的候選版本。這個階段不會再新增功能,主要用于修復(fù) Bug;
- GA 版本: 正式發(fā)布版本,也可以對應(yīng)于 release 版本。
這些版本號在一些流行的框架的演變過程中非常常見。
3. 主干、分支與標(biāo)簽
通常情況下,我們在進行項目開發(fā)的過程中,會使用到版本控制工具,例如 svn 或者 git,這時候就會涉及到主干,分支以及標(biāo)簽的概念,那么這里我們簡單介紹一下這三個概念。
3.1 概念
- 主干: 通常是項目代碼的主體。會存在于整個項目周期中,其他的所有分支都是從這里開始的,一般情況下,項目最新的源代碼或者所有的變更記錄都可以在這里找到;
- 分支: 從主干中某個節(jié)點分離出來的代碼。在分支剛剛創(chuàng)建的時候,具有當(dāng)時主干中所有的源代碼。通常分支是為了修改某些 Bug 或者進行一些其他的開發(fā),這些源代碼的修改并不會影響主干。一旦這個分支中的代碼驗證通過后,可以將代碼歸并到主干中去;
- 標(biāo)簽: 通常用來標(biāo)記主干或者分支中某個時間節(jié)點的狀態(tài),
從下面的圖中,我們可以比較清晰地看出,主干,分支與標(biāo)簽三者之間的關(guān)系:
3.2 創(chuàng)建分支
我們在了解了主干以及分支的概念之后,那么我們?nèi)绾稳?chuàng)建分支呢?通常情況下我們可以使用 Svn 或者 Git 自帶的創(chuàng)建分支的方式來創(chuàng)建需要的分支,但是,這個時候會存在一個問題:我們需要手動去修改新創(chuàng)建出的分支的 pom.xml 文件中的內(nèi)容。既然說到版本管理,那想必 Maven 肯定是可以幫助我們做這件事情的。
那么接下來我們來看一下如何使用 Maven 來創(chuàng)建分支,這里我們使用 Git 配合 Maven 來演示如何創(chuàng)建分支。
我們想要使用 Maven 來幫助我們創(chuàng)建分支,首先我們需要配置 scm ,這樣 Maven 就可以來代替 Git 來進行操作。
這里我們在 gitee 上創(chuàng)建一個倉庫來放置我們的項目。
1. 將 scm 配置到 pom.xml 文件中:
<scm>
<connection>scm:git:git@gitee.com:jhulk/first-project.git</connection>
<developerConnection>scm:git:git@gitee.com:jhulk/first-project.git</developerConnection>
</scm>
2. 將 maven-release-plugin 插件配置到 pom.xml 文件中:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.3</version>
<configuration>
<tagNameFormat>${project.version}</tagNameFormat>
<autoVersionSubmodules>true</autoVersionSubmodules>
</configuration>
</plugin>
</plugins>
3. 執(zhí)行 mvn release:branch -DbranchName=1.0.1 -DupdateBranchVersions=true -DupdateWorkingCopyVersions=false
命令:
- -DbranchName: 目標(biāo)分支。這里我們可以根據(jù)需要來自定義新分支的命名結(jié)構(gòu);
- -DupdateBranchVersions: 在分支中更新版本;
- -DupdateWorkingCopyVersions: 在當(dāng)前分支更新版本。
在執(zhí)行的時候, Maven 會問 branch version 是否為 1.0.1-SNAPSHOT?這個是我們想要的,直接 enter 即可。
執(zhí)行完成之后,我們查看 Git 的遠程倉庫中,可以看到新生成的分支。
4. 執(zhí)行 mvn release:prepare
命令:
在執(zhí)行的時候,Maven 會問 release version 是否是 1.0.0?這個是否是我們想要的,直接選擇 enter 即可。
緊接著,Maven 會問我們 release tag 是否是1.0.0-SNAPSHOT?這個也是我們想要的,直接 ente r即可。
緊接著,Maven 會問我們新的版本是否是1.0.1-SNAPSHOT?這里輸入新版本為1.1.0-SNAPSHOT,然后 enter。
執(zhí)行成功之后,我們更新一下代碼,會發(fā)現(xiàn),主干上的 pom.xml 文件的版本已經(jīng)升級為1.1.0-SNAPSHOT了。
4. 小結(jié)
本節(jié)當(dāng)中,我們著重介紹了在 Maven 的世界中,我們一般是如何來約束版本的,以及這些約束所代表的含義,最后,我們還介紹了如何使用 Maven 來管理這些版本。