问题:
工作中接触到一些老项目,使用tomcat的ROOT部署方式,使用IDEA无法直接进行打包更新,所以只能通过增量更新的方式去替换文件,如果手动将需要修改的文件一个一个去替换,浪费人力,所以研究一个批量增量更新方式。
原理:
- 借助git的差异化对比,得到每次要更新的文件路径;
- 借助java的jar命令根据文件路径直接打包;
- 将打成的jar替换到tomcat中。
方法一:
git archive -o ../update1.zip ec0f7d57 $(git diff --name-only startPoint endPoint)
- 其中startPoint为git差异起始点id,endPoint为差异结束点id。
- 该方法无法处理class文件的改变(因为git记录的是java文件的改变,而更新需要编译之后的class文件)。
方法二 update.bat (需要ide编译class项目,可能出现中文乱码情况)
@echo off
rem 定义class路径
rem SET /p outPath=输入文件编译目录(class):
rem 路径应该能到达WEB-INF同级
set outPath=out/artifacts/sp_Web_exploded
rem 定义git差异节点
rem SET /p startPoint=输入起始节点id:
rem SET /p endPoint=输入结束节点id:
set startPoint=446e54e1
set endPoint=76c2e29e
rem 定义jar文件路径
SET txtName=source.txt
SET sourceTxtFile=%outPath%/%txtName%
git diff --name-only %startPoint% %endPoint% > %sourceTxtFile%
rem 使用bat命令替换
@setlocal enabledelayedexpansion
rem 读取文件所有内容
for /f "delims=" %%i in (%sourceTxtFile%) do (
rem 设置变量a为每行内容
set a=%%i
rem 替换内容 1.替换java为class 2.替换src目录为WEB-INF/classes/ 3.替换WebRoot/为''
set "a=!a:.java=.class!"
set "a=!a:tysp_src/=WEB-INF/classes/!"
set "a=!a:system_src/=WEB-INF/classes/!"
set "a=!a:WebRoot/=!"
rem 把修改后的全部行存入$
echo !a!>>$)
move $ %sourceTxtFile% || EXIT /B
cd %outPath%
jar -cvf target-update.jar @%txtName%
rem echo update完成!
pause
方法三 update.sh(借助git bash执行,处理中文乱码)
#定义WEB-INF路径
cd out/artifacts/wt_Web_exploded
#获取2个节点之间的差异文件
#'s#old_string#new_string#g' 替换路径
git diff c2aed67d fd7ab26d --name-only > 1.txt && sed -i -e 's#.java#.class#g' -e 's#tysp_src#WEB-INF/classes/#g' -e 's#system_src#WEB-INF/classes/#g' -e 's#WebRoot/##g' -e 's#src/#WEB-INF/classes/#g' 1.txt && cat 1.txt | xargs tar -cvf update.tar.gz
**遇到问题:
- 一、cmd文件中定义变量不能含有空格 set var=xx**
- 二、排除指定文件夹之后比较改动的文件
# --name-status 显示增删改表标识
# --name-only 只显示增删改的文件名
git diff --name-status point1 point2 -- ':!src/views/assetManagement' > fileLog.txt
git diff --name-status --oneline -- . '!src/views/assetManagement' > fileLog.txt
评论区