目前每次更新,都需要在每一个工程的pom
文件中更改版本号,有时候很容易漏改;而且这一改就是十几个地方,等后期模块变得越来越多,如果还是一个个改就真的有点上头了…所以版本号升级的优化方案就这么来了。
完整项目地址:https://github.com/intomylife/osc-api
v1.4.3 标签地址:https://github.com/intomylife/osc-api/releases/tag/v1.4.3
v1.4.3 下载地址:zip,tar.gz
注:对于标签的说明「初学者商城」- 写在最前面 #5.1
开始想着把版本号全部放在聚合服务工程
中统一配置
osc-service
中能打包成功,但是base-service-core
打包会失败,报错找不到${xxx.xxx}
,也就是可以打包父工程,无法打包子工程
标签引入${}
时 IDEA 会有警告:Properties in parent definition are prohibited
,这个问题倒是好解决:打开 IDEA -> Preferences… -> 搜索prohibited
-> 找到 Editor - Inspections -> 取消勾选 Maven - Usage of properties in parent description无法打包这个问题很严重,查了很久也没找到合理的解决方案,迫不得已又改回版本号各自配置。就在准备放弃的时候,又突然发现了另一种解决方案
最后发现,Maven
有专门的命令来更新版本号:mvn versions:set
#!/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}
## 4. 返回根目录
cd ../
## 结束
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
------------------- 2020.06.13 更新:归类脚本文件 -------------------
MacBook-Pro:osc-api zouwencong$ ls -all
total 40
drwxr-xr-x 11 zouwencong staff 352 Jun 13 22:27 .
drwxr-xr-x 7 zouwencong staff 224 Jun 6 16:22 ..
-rw-r--r--@ 1 zouwencong staff 10244 Jun 13 23:03 .DS_Store
drwxr-xr-x 15 zouwencong staff 480 Jun 13 23:01 .git
-rw-r--r-- 1 zouwencong staff 428 Jun 4 11:47 .gitignore
drwxr-xr-x 11 zouwencong staff 352 Jun 13 23:07 .idea
-rw-r--r--@ 1 zouwencong staff 33 Nov 15 2019 README.md
drwxr-xr-x 4 zouwencong staff 128 Jan 10 11:28 logs
drwxr-xr-x 10 zouwencong staff 320 Jun 13 18:34 osc-commons
drwxr-xr-x 14 zouwencong staff 448 Jun 11 09:27 osc-service
drwxr-xr-x 5 zouwencong staff 160 Jun 13 22:27 script
MacBook-Pro:osc-api zouwencong$
script
目录下,这时的命令就更改为./script/version/growth-version.sh 1.4.3 true
核心命令:
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}
:执行此命令会自动更新指定节点的属性值。首先这里更新目标是
节点中的属性,然后会把值更新为多少,取的是第一个入参${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
工程依赖,就会报错@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 ('..\script\version\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 ('..\script\version\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 ## 4. 返回根目录
cd ../
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
------------------- 2020.06.13 更新:归类脚本文件 -------------------
.bat
批处理脚本执行命令更改为:script\version\growth-version.bat 1.4.3 true
v1.4.3
标签的代码或者对照本篇博客更改v1.4.2
标签的代码macOS
系统,则还需要设置.sh
脚本文件的可执行权限:chmod +x growth-version.sh
IDEA
底部的Terminal
终端入口./script/version/growth-version.sh 1.4.3 false
或script\version\growth-version.bat 1.4.3 false
果然“偷懒”是人类发展的第一生产力,为了省去每次去更改十几个文件,导致“奇怪的”知识点又增加了呢,巴适。
希望能够帮助到你
over