1. 进入程序目录
将路径改成服务器上的实际路径:
bash
cd /opt/lims3.0-test/lims-3.0-sdfrd/wuk-lims3.0/service
保存当前目录:
bash
APP_DIR=$(pwd)
检查文件是否存在:
bash
ls -lh wuk-lims3.0.jar nf-test-3.0.0.jar start.sh stop.sh
2. 查询主包内部的 nf-test 路径
bash
unzip -Z1 wuk-lims3.0.jar | grep 'nf-test-3.0.0.jar'
正常应该显示:
text
BOOT-INF/lib/nf-test-3.0.0.jar
设置内部路径变量:
bash
INNER_PATH=$(unzip -Z1 wuk-lims3.0.jar | grep 'nf-test-3.0.0.jar' | head -n 1)
确认变量:
bash
echo "$INNER_PATH"
如果输出为空,不要继续替换。
3. 停止服务
bash
sh stop.sh
等待几秒:
bash
sleep 5
检查进程是否停止:
bash
pgrep -af 'wuk-lims3.0.jar'
没有输出表示已经停止。
4. 备份原来的主程序包
使用时间作为备份文件名:
bash
BACKUP="wuk-lims3.0.jar.backup_$(date +%Y%m%d_%H%M%S)"
cp -a wuk-lims3.0.jar "$BACKUP"
检查备份:
bash
ls -lh "$BACKUP"
例如生成:
text
wuk-lims3.0.jar.backup_20260807_110500
5. 创建待修改的临时主包
不要直接修改正式包,先复制一份:
bash
cp -a wuk-lims3.0.jar wuk-lims3.0.jar.new
检查:
bash
ls -lh wuk-lims3.0.jar wuk-lims3.0.jar.new
6. 创建临时目录
bash
TMP_DIR=$(mktemp -d)
创建主包内部相同的目录结构:
bash
mkdir -p "$TMP_DIR/$(dirname "$INNER_PATH")"
把新的 nf-test-3.0.0.jar 复制进去:
bash
cp -a nf-test-3.0.0.jar "$TMP_DIR/$INNER_PATH"
检查:
bash
ls -lh "$TMP_DIR/$INNER_PATH"
7. 删除主包内部旧的 nf-test 包
bash
zip -d "$APP_DIR/wuk-lims3.0.jar.new" "$INNER_PATH"
删除后确认旧包已经不存在:
bash
unzip -Z1 "$APP_DIR/wuk-lims3.0.jar.new" | grep 'nf-test-3.0.0.jar'
此时应该没有输出。
8. 添加新的 nf-test 包
必须使用 -0,保证内部依赖包以"不压缩"方式存储:
bash
cd "$TMP_DIR"
zip -0 "$APP_DIR/wuk-lims3.0.jar.new" "$INNER_PATH"
cd "$APP_DIR"
确认新包已经加入:
bash
unzip -Z1 wuk-lims3.0.jar.new | grep 'nf-test-3.0.0.jar'
应该输出:
text
BOOT-INF/lib/nf-test-3.0.0.jar
9. 检查主包是否损坏
bash
unzip -t wuk-lims3.0.jar.new
最后应该看到类似:
text
No errors detected in compressed data
检查内部包是否为 Stored:
bash
unzip -lv wuk-lims3.0.jar.new | grep 'nf-test-3.0.0.jar'
输出中应该包含:
text
Stored
10. 对比新包和内部包的 MD5
计算外部新包 MD5:
bash
md5sum nf-test-3.0.0.jar
计算替换后主包内部的 MD5:
bash
unzip -p wuk-lims3.0.jar.new "$INNER_PATH" | md5sum
两个 MD5 值一致,表示内部包替换成功。
也可以直接执行:
bash
NEW_MD5=$(md5sum nf-test-3.0.0.jar | awk '{print $1}')
INNER_MD5=$(unzip -p wuk-lims3.0.jar.new "$INNER_PATH" | md5sum | awk '{print $1}')
echo "外部新包:$NEW_MD5"
echo "内部新包:$INNER_MD5"
[ "$NEW_MD5" = "$INNER_MD5" ] && echo "校验成功" || echo "校验失败"
11. 正式替换主程序包
确认前面的检查全部通过后执行:
bash
mv -f wuk-lims3.0.jar.new wuk-lims3.0.jar
清理临时目录:
bash
rm -rf "$TMP_DIR"
检查正式包:
bash
ls -lh wuk-lims3.0.jar "$BACKUP"
12. 启动服务
bash
sh start.sh
等待启动:
bash
sleep 10
检查进程:
bash
pgrep -af 'wuk-lims3.0.jar'
检查端口,例如程序端口是 9000:
bash
ss -lntp | grep ':9000'
查看最近日志:
bash
tail -n 200 server.log
持续查看日志:
bash
tail -f server.log
按 Ctrl+C 退出日志查看。
一套连续执行的核心命令
确认程序目录正确后,可以依次执行:
bash
cd /opt/lims3.0-test/lims-3.0-sdfrd/wuk-lims3.0/service
APP_DIR=$(pwd)
INNER_PATH=$(unzip -Z1 wuk-lims3.0.jar | grep 'nf-test-3.0.0.jar' | head -n 1)
echo "内部包路径:$INNER_PATH"
test -f wuk-lims3.0.jar || { echo "主包不存在"; exit 1; }
test -f nf-test-3.0.0.jar || { echo "新 nf-test 包不存在"; exit 1; }
test -n "$INNER_PATH" || { echo "主包内没有找到 nf-test 包"; exit 1; }
sh stop.sh
sleep 5
pgrep -af 'wuk-lims3.0.jar'
BACKUP="wuk-lims3.0.jar.backup_$(date +%Y%m%d_%H%M%S)"
cp -a wuk-lims3.0.jar "$BACKUP"
cp -a wuk-lims3.0.jar wuk-lims3.0.jar.new
TMP_DIR=$(mktemp -d)
mkdir -p "$TMP_DIR/$(dirname "$INNER_PATH")"
cp -a nf-test-3.0.0.jar "$TMP_DIR/$INNER_PATH"
zip -d "$APP_DIR/wuk-lims3.0.jar.new" "$INNER_PATH"
cd "$TMP_DIR"
zip -0 "$APP_DIR/wuk-lims3.0.jar.new" "$INNER_PATH"
cd "$APP_DIR"
unzip -t wuk-lims3.0.jar.new
NEW_MD5=$(md5sum nf-test-3.0.0.jar | awk '{print $1}')
INNER_MD5=$(unzip -p wuk-lims3.0.jar.new "$INNER_PATH" | md5sum | awk '{print $1}')
echo "外部新包:$NEW_MD5"
echo "内部新包:$INNER_MD5"
if [ "$NEW_MD5" != "$INNER_MD5" ]; then
echo "MD5 校验失败,停止替换"
exit 1
fi
mv -f wuk-lims3.0.jar.new wuk-lims3.0.jar
rm -rf "$TMP_DIR"
sh start.sh
sleep 10
pgrep -af 'wuk-lims3.0.jar'
tail -n 200 server.log
启动失败时回滚
停止服务:
bash
sh stop.sh
查看备份:
bash
ls -lht wuk-lims3.0.jar.backup_*
自动选择最新备份:
bash
LATEST_BACKUP=$(ls -1t wuk-lims3.0.jar.backup_* | head -n 1)
echo "$LATEST_BACKUP"
恢复:
bash
cp -a "$LATEST_BACKUP" wuk-lims3.0.jar
重新启动:
bash
sh start.sh
sleep 10
pgrep -af 'wuk-lims3.0.jar'
tail -n 200 server.log