1. 前言
目前每次更新,都需要在每一個工程的pom
文件中更改版本號,有時候很容易漏改;而且這一改就是十幾個地方,等後期模塊變得越來越多,如果還是一個個改就真的有點上頭了…所以版本號升級的優化方案就這麼來了。
2. 源碼
完整項目地址:https://github.com/intomylife/osc-front
v1.4.3 標籤地址:https://github.com/intomylife/osc-api/releases/tag/v1.4.3
注:對於標籤的說明「初學者商城」- 寫在最前面 #5.1
3. 接口
3.1 查看更改內容
3.2 統一配置版本號
開始想着把版本號全部放在聚合服務工程
中統一配置
- 預期效果: 版本號都配置在一個文件中,容易維護,不會漏改
- 實際結果:
osc-service
中能打包成功,但是base-service-core
打包會失敗,報錯找不到${xxx.xxx}
,也就是可以打包父工程,無法打包子工程 - 其他問題: 在子工程中的
<parent>
標籤引入${}
時 IDEA 會有警告:Properties in parent definition are prohibited
,這個問題倒是好解決:打開 IDEA -> Preferences… -> 搜索prohibited
-> 找到 Editor - Inspections -> 取消勾選 Maven - Usage of properties in parent description
3.3 各自配置版本號
無法打包這個問題很嚴重,查了很久也沒找到合理的解決方案,迫不得已又改回版本號各自配置。就在準備放棄的時候,又突然發現了另一種解決方案
3.4 使用腳本更新版本號
最後發現,Maven
有專門的命令來更新版本號:mvn versions:set
3.4.1 .sh
#!/bin/bash
## $() - 方法,${} - 變量
## 開始
echo [INFO] ----------------------------- start --------------------------------------
## 獲取入參,版本號
new_versiont=$1
## 輸出看一眼
echo new_versiont: ${new_versiont}
## 獲取入參,是否需要備份(true | false)
is_bak=$2
## 輸出看一眼
echo is_bak: ${is_bak}
## 非空判斷
if [ $new_versiont ];
then
## 1. 更新 commons 工程版本號
cd osc-commons/
## 獲取當前工程的版本號
## old_version=$(mvn org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=project.version -q -DforceStdout)
## 輸出看一眼
## echo old_version: ${old_version}
## 升級
mvn versions:set -DoldVersion=* -DnewVersion=${new_versiont} -DgenerateBackupPoms=${is_bak} && mvn clean install
## 2. 更新 service 工程中的 commons 工程版本號
cd ../osc-service/
## 獲取當前工程的版本號
## old_version=$(mvn org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=project.version -q -DforceStdout)
## 輸出看一眼
## echo old_version: ${old_version}
## 更新
mvn versions:update-properties -DincludeProperties={osc.commons.version} -Dproperties=[${new_versiont}] -DgenerateBackupPoms=${is_bak}
## 3. 更新 service 工程版本號
mvn versions:set -DoldVersion=* -DnewVersion=${new_versiont} -DgenerateBackupPoms=${is_bak}
## 結束
echo [INFO] ----------------------------- end --------------------------------------
else
## 結束
echo [INFO] -------------------------- 缺少參數 -------------------------------------
fi
非常簡單的一個腳本文件:判斷是否入參了版本號,如果有,就進行版本號的更新
如何使用:
- 點擊
IDEA
底部的Terminal
終端入口 - 進入到項目根目錄
MacBook-Pro:osc-api zouwencong$ pwd
/Users/zouwencong/JavaWork/my_osc/osc-api
MacBook-Pro:osc-api zouwencong$ ls -all
total 64
drwxr-xr-x 13 zouwencong staff 416 Jun 5 21:50 .
drwxr-xr-x 7 zouwencong staff 224 Jun 6 16:22 ..
-rw-r--r--@ 1 zouwencong staff 8196 Jun 5 21:50 .DS_Store
drwxr-xr-x 15 zouwencong staff 480 Jun 5 22:21 .git
-rw-r--r-- 1 zouwencong staff 428 Jun 4 11:47 .gitignore
drwxr-xr-x 11 zouwencong staff 352 Jun 7 16:44 .idea
-rw-r--r--@ 1 zouwencong staff 33 Nov 15 2019 README.md
-rw-rw-rw- 1 zouwencong staff 1622 Jun 5 22:04 growth-version.bat
-rwxrwxrwx@ 1 zouwencong staff 1649 Jun 5 22:11 growth-version.sh
drwxr-xr-x 4 zouwencong staff 128 Jan 10 11:28 logs
-rw-rw-rw- 1 zouwencong staff 122 Jun 5 22:04 old-version.bat
drwxr-xr-x 10 zouwencong staff 320 Jun 5 15:29 osc-commons
drwxr-xr-x 14 zouwencong staff 448 Jun 5 15:29 osc-service
MacBook-Pro:osc-api zouwencong$
- 輸入命令
./growth-version.sh 1.4.3 true
:這時會把所有工程的版本號更改爲1.4.3
,而第二個參數true
是指備份pom
文件,當然腳本是測試很多次的,確保安全無誤,所以從下次開始第二個參數可以指定爲false
核心命令:
mvn versions:set -DoldVersion=* -DnewVersion=${new_versiont} -DgenerateBackupPoms=${is_bak}
:執行此命令會自動更新多模塊中所有的父模塊和子模塊的版本號。更新爲多少,取的是第一個入參${new_versiont}
;是否備份pom
文件,取的是第二個入參${is_bak}
mvn versions:update-properties -DincludeProperties={osc.commons.version} -Dproperties=[${new_versiont}] -DgenerateBackupPoms=${is_bak}
:執行此命令會自動更新指定節點的屬性值。首先這裏更新目標是<properties></properties>
節點中的屬性,然後會把值更新爲多少,取的是第一個入參${new_versiont}
;是否備份pom
文件,取的是第二個入參${is_bak}
- 在
#1
中着重標出【所有,父模塊,子模塊】是因爲第一條命令不會自動更新引入的其他模塊的版本號,在項目中,commons
就屬於其他模塊工程;所以就需要使用第二條命令來單獨的把service
工程中配置的commons
工程的版本號更新,是這樣的:
<properties>
<!-- 公用工程版本號 -->
<osc.commons.version>1.4.3</osc.commons.version>
</properties>
...
<!-- commons 工程依賴 -->
<dependency>
<groupId>com.zwc</groupId>
<artifactId>osc-commons</artifactId>
<version>${osc.commons.version}</version>
</dependency>
其它命令:
如果執行上面的命令並且入參是否備份選擇的是true
的話,就會導致在每個工程中都會出現一個*.versionsBackup
文件,此文件就是自動備份的執行命令前的pom
;這時
- 如果更新後的
pom
不是預期想要的,就可以使用命令mvn versions:revert
來回滾 - 如果更新後的
pom
達到了預期效果,就可以使用命令mvn versions:commit
來自動刪除*.versionsBackup
備份文件
細節的處理:
- 在更新
commons
工程版本號的時候還有這麼一段&& mvn clean install
,是因爲如果只是單純的更新commons
工程的版本號,而不把它安裝到本地倉庫中,那麼會導致,在後面更新service
工程的時候找不到最新的commons
工程依賴,就會報錯
3.4.2 .bat
@echo off
REM ## 開始
echo [INFO] ----------------------------- start --------------------------------------
REM ## 獲取入參,版本號
set new_versiont=%1%
REM ## 輸出看一眼
echo new_versiont: %new_versiont%
REM ## 獲取入參,是否需要備份(true | false)
set is_bak=%2%
REM ## 輸出看一眼
echo is_bak: %is_bak%
REM ## 非空判斷
if defined new_versiont (
REM ## 1. 更新 commons 工程版本號
cd osc-commons/
REM ## 獲取當前工程的版本號
REM for /f "delims=" %%i in ('..\old-version.bat') do set old_version=%%i
REM ## 輸出看一眼
REM echo old_version: %old_version%
REM ## 升級
mvn versions:set -DoldVersion=* -DnewVersion=%new_versiont% -DgenerateBackupPoms=%is_bak% && mvn clean install
REM ## 2. 更新 service 工程中的 commons 工程版本號
cd ../osc-service/
REM ## 獲取當前工程的版本號
REM for /f "delims=" %%i in ('..\old-version.bat') do set old_version=%%i
REM ## 輸出看一眼
REM echo old_version: %old_version%
REM ## 更新
mvn versions:update-properties -DincludeProperties={osc.commons.version} -Dproperties=[%new_versiont%] -DgenerateBackupPoms=%is_bak%
REM ## 3. 更新 service 工程版本號
mvn versions:set -DoldVersion=* -DnewVersion=%new_versiont% -DgenerateBackupPoms=%is_bak%
REM ## 結束
echo [INFO] ----------------------------- end --------------------------------------
) else (
REM ## 結束
echo [INFO] -------------------------- 缺少參數 -------------------------------------
)
@echo off
mvn org.apache.maven.plugins:maven-help-plugin:3.2.0:evaluate -Dexpression=project.version -q -DforceStdout
與.sh
所要達到的效果與目的一致,所以就簡單說明一下存在差異的地方:
有哪些差異:
- 語法上的差異
- 執行方式的差異,
.bat
批處理腳本執行命令:growth-version.bat 1.4.3 true
4. 驗證
4.1 接口
- 下載
v1.4.3
標籤的代碼或者對照本篇博客更改v1.4.2
標籤的代碼 - 如果是
macOS
系統,則還需要設置.sh
腳本文件的可執行權限:chmod +x growth-version.sh
- 點擊
IDEA
底部的Terminal
終端入口 - 進入到項目根目錄
- 根據不同系統,使用不同命令:
./growth-version.sh 1.4.3 false
或growth-version.bat 1.4.3 false
5. 結語
果然“偷懶”是人類發展的第一生產力,爲了省去每次去更改十幾個文件,導致“奇怪的”知識點又增加了呢,巴適。
希望能夠幫助到你
over