基础环境配置脚本需声明解释器、设路径与参数,用env区分环境,显式定义app_name和repo_url;java依赖jdk 8+与maven/gradle,须验证java -version与mvn -v;拉码前判目录存在性,存在则git pull --rebase,否则git clone;部署前清理target/或build/;用set -e确保失败即停;编译用mvn clean package -dmaven.test.skip=true;校验jar存在且可执行;复制jar至/opt/app/$app_name/并重命名;保留旧版jar用于回滚;用systemd管理服务,含user、workingdirectory、execstart及restart=always;重启前检查端口占用,启动后轮询健康接口30秒,失败则回滚;日志定向至/var/log/$app_name/app.log;确保部署用户对代码、jar、日志目录有权限,git配好凭据,systemd中显式指定java_home。

准备基础环境与变量配置
脚本开头需声明解释器、设置基础路径和参数,避免硬编码。建议用 ENV 变量控制不同环境(如 test/prod),用 APP_NAME 和 REPO_URL 显式定义应用名与 Git 地址。Java 环境依赖 JDK 8+ 和 Maven(或 Gradle),提前在目标机器安装并验证 java -version 与 mvn -v 可执行。
拉取源码并清理旧构建
使用 git clone 或 git pull 更新代码。推荐先判断项目目录是否存在:存在则进入并 git pull --rebase;不存在则 git clone。每次部署前应清理上一次的 target/(Maven)或 build/(Gradle)目录,防止残留 class 或 jar 影响打包一致性。可加 set -e 让任意命令失败时脚本立即退出。
- 用
cd "$PROJECT_DIR" && git reset --hard && git pull强制同步最新提交 - 用
rm -rf target/ && mkdir -p target/清理构建产物 - 若需指定分支,追加
-b main --single-branch
编译打包并校验产物
执行 mvn clean package -Dmaven.test.skip=true(跳过测试)生成 jar。关键点是确认最终 jar 文件存在且可执行:test -f "target/*.jar" 并用 unzip -t 或 java -Djava.awt.headless=true -jar xxx.jar --help &>/dev/null 粗略校验。若为 Spring Boot 项目,确保 spring-boot-maven-plugin 已启用,生成 fat-jar。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 用
find target/ -name "*.jar" -type f | head -n1获取最新 jar 路径 - 将 jar 复制到统一发布目录(如
/opt/app/$APP_NAME/),重命名为$APP_NAME.jar - 保留上一版本 jar 用于快速回滚(如
cp $OLD_JAR $BACKUP_DIR/$(date +%s).jar)
平滑重启服务
用 systemd 管理 Java 进程最稳妥。提前编写 /etc/systemd/system/$APP_NAME.service,包含 User、WorkingDirectory、ExecStart(带 JVM 参数)、Restart=always。脚本中只需执行 systemctl daemon-reload && systemctl restart $APP_NAME。若暂未用 systemd,可用 pid 文件 + kill + nohup 启动,但务必加等待逻辑(如 sleep 3 && curl -sf http://localhost:8080/actuator/health)确认服务就绪。
- 重启前检查端口占用:
lsof -i :8080 | grep LISTEN,有则kill -15停旧进程 - 启动后轮询健康接口最多 30 秒,失败则自动回滚 jar 并报错退出
- 日志重定向到
/var/log/$APP_NAME/app.log,便于排查
不复杂但容易忽略的是权限与上下文:脚本应以部署用户运行(非 root),确保该用户对代码目录、jar 目录、日志目录有读写权限;Git 配置好 SSH key 或 HTTPS 凭据;systemd service 文件里 Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64" 显式指定 JDK 路径。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










