### [从源码部署 Java Spring Boot:打包 Jar 包 + systemd 守护](https://8maoku.com/topic/2468) **Published:** 2026-09-02T10:39:09 **Author:** maoku **Excerpt:** Spring Boot 项目源码构建、打包可执行 Jar、用 systemd 守护后台运行、Nginx 反向代… 1Spring Boot 内嵌了 Tomcat,打包出来的 `.jar` 就是一个可直接运行的完整应用。部署的重点就两件事:把 Jar 跑起来、让它崩了能自动拉起。本文用 systemd 来完成后者。 ## 一、环境准备 安装 JDK,版本需与项目编译目标一致(Spring Boot 3.x 需要 JDK 17+): ``` apt install openjdk-17-jdk -y java -version ``` ## 二、打包可执行 Jar Maven 项目在源码根目录执行: ``` mvn clean package -DskipTests ``` Gradle 项目则执行 `gradle build`。产物在 `target/` 下,如 `app-1.0.0.jar`。上传到服务器后先手动验证能启动: ``` java -jar app-1.0.0.jar --server.port=8080 ``` ## 三、配置外置 生产环境不要把配置写死在 Jar 里,用外部 `application.yml` 覆盖: ``` java -jar app-1.0.0.jar --spring.config.additional-location=file:/etc/app/application.yml ``` ## 四、systemd 守护 新建服务文件 `/etc/systemd/system/myapp.service`: ``` [Unit] Description=My Spring Boot App After=network.target [Service] User=www ExecStart=/usr/bin/java -jar /opt/app/app-1.0.0.jar --spring.config.additional-location=file:/etc/app/application.yml SuccessExitStatus=143 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target ``` 启用并启动: ``` systemctl daemon-reload systemctl enable --now myapp systemctl status myapp ``` `Restart=always` 保证进程退出后自动拉起,`SuccessExitStatus=143` 让优雅关闭不被误判为异常。 ## 五、Nginx 反向代理 与 Node 项目类似,Nginx 监听 80/443,代理到本机 8080,并配置 `proxy_set_header` 传递真实 IP 与 Host。 ## 六、日志与调优 - 日志落盘:`StandardOutput=append:/var/log/myapp.log`,或交给 logback 滚动。 - JVM 内存:`-Xms512m -Xmx512m` 按机器规格调整,避免默认吃满。 - 优雅停机:Spring Boot 2.3+ 支持 graceful shutdown,配合 `TimeoutStopSec` 使用。 systemd 是 Linux 上最可靠的进程守护方案,比 `nohup` 加 `&` 专业得多——开机自启、异常重启、日志采集全都免费获得。 **Comments:** **前端小明:** 请问文章中提到的Nginx配置如何实现日志的外置? **程序猿:** 我也有一个类似的项目,在部署过程中遇到了一些问题,这篇文章给了我一些启发。 **摸鱼切图仔:** 这篇文章详细介绍了Spring Boot项目的部署流程,对于初学者来说非常实用。 ---