java项目一键打包与平滑发布通过maven+shell实现:先用mvn clean package跳过测试生成包,再按时间戳创建版本目录、软链接切换,并通过restart.sh优雅启停jvm进程。

Java 项目一键打包:Maven + Shell 脚本协同
在 Linux 环境下,Java 项目通常用 Maven 构建。Shell 脚本只需调用 mvn clean package -Dmaven.test.skip=true 即可跳过测试、生成 JAR/WAR 包。关键是要确保脚本中指定正确的 Maven 配置路径(如 ~/.m2/settings.xml)和 JDK 版本(通过 export JAVA_HOME=/usr/lib/jvm/java-17-openjdk 显式声明),避免因环境差异导致打包失败。
平滑发布核心:软链接切换 + 进程优雅启停
“平滑发布”本质是避免服务中断。推荐采用“目录版本化 + 当前软链接”方式:
- 每次发布将新包解压到带时间戳的独立目录,例如
/opt/myapp/app-202405201430 - 用
ln -snf /opt/myapp/app-202405201430 /opt/myapp/current更新软链接 - 启动脚本从
/opt/myapp/current启动应用,并监听spring.lifecycle.timeout-per-shutdown-phase=30s等配置保障优雅停机 - 旧进程需先发送
kill -15,等待几秒后检查进程是否退出,未退出再发kill -9
完整发布脚本示例(含错误处理与日志)
以下是一个轻量但健壮的 deploy.sh 核心逻辑片段:
#!/bin/bash
APP_NAME="myapp"
APP_JAR="target/${APP_NAME}.jar"
DEPLOY_DIR="/opt/${APP_NAME}"
CURRENT_LINK="${DEPLOY_DIR}/current"
BACKUP_DIR="${DEPLOY_DIR}/backup"
# 打包
if ! mvn clean package -Dmaven.test.skip=true; then
echo "[ERROR] Maven build failed"; exit 1
fi
# 创建新版本目录
NEW_DIR="${DEPLOY_DIR}/app-$(date +%Y%m%d%H%M)"
mkdir -p "$NEW_DIR"
cp "$APP_JAR" "$NEW_DIR/"
# 备份当前版本(可选)
if [ -d "$CURRENT_LINK" ]; then
cp -r "$CURRENT_LINK" "${BACKUP_DIR}/$(basename $CURRENT_LINK)-$(date +%s)"
fi
# 切换软链接并重启
ln -snf "$NEW_DIR" "$CURRENT_LINK"
bash "${CURRENT_LINK}/bin/restart.sh"
配套 restart.sh:精准控制 JVM 进程
restart.sh 放在每个版本目录的 bin/ 下,负责查杀旧进程、启动新实例:
- 用
pgrep -f "${APP_NAME}.jar" | xargs kill -15发送终止信号 - sleep 3 秒后用
pgrep -f "${APP_NAME}.jar"检查残留,有则强杀 - 使用
nohup java -Xmx512m -jar ${APP_NAME}.jar --spring.profiles.active=prod > logs/app.log 2>&1 &后台启动 - 记录 PID 到
app.pid,便于后续管理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











