侧边栏壁纸
博主头像
seems 博主等级

学习博客

  • 累计撰写 62 篇文章
  • 累计创建 41 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

基于git进行war批量打包(增量更新)

seems
2023-10-20 / 0 评论 / 0 点赞 / 24 阅读 / 0 字

问题:

工作中接触到一些老项目,使用tomcat的ROOT部署方式,使用IDEA无法直接进行打包更新,所以只能通过增量更新的方式去替换文件,如果手动将需要修改的文件一个一个去替换,浪费人力,所以研究一个批量增量更新方式。

原理:

  1. 借助git的差异化对比,得到每次要更新的文件路径;
  2. 借助java的jar命令根据文件路径直接打包;
  3. 将打成的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
0

评论区