Spring Boot部署核心是确保OpenJDK版本兼容(3.x需JDK 17+)、正确执行java -jar启动、并用systemd保障进程长期存活,而非部署OpenJDK本身。

OpenJDK 本身不是“部署工具”,它只是 Spring Boot 应用运行所依赖的 Java 运行时环境。真正部署 Spring Boot,核心是:确认 OpenJDK 版本兼容、正确启动 JAR、并保障进程长期存活。别被“部署”二字绕晕——你不是在部署 OpenJDK,而是在 OpenJDK 上跑 Spring Boot。
确认 OpenJDK 版本是否支持你的 Spring Boot
Spring Boot 2.7+ 官方最低要求 JDK 11;Spring Boot 3.x 强制要求 JDK 17+(不支持 JDK 8 或 11)。查清楚你用的 Spring Boot 版本再选 JDK:
-
spring-boot-starter-parent3.2.x → 必须用java-17-openjdk-devel或更高(如java-21-openjdk-devel) - CentOS 6.8 只能装到 OpenJDK 8(
java-1.8.0-openjdk-devel),无法运行 Spring Boot 3.x —— 这是硬性限制,不是配置问题 - Ubuntu/Debian 上用
sudo apt install openjdk-17-jdk更稳妥,避免 yum 源陈旧 - 验证命令必须执行:
java -version输出里要有17.0.x或21.0.x,且带64-Bit Server VM
用 java -jar 启动时常见失败原因
即使 java -version 正常,java -jar myapp.jar 仍可能立即退出或报错,典型原因有:
- JAR 包没加执行权限:
chmod +x myapp.jar不必要,但确保用户对 JAR 文件有读权限(ls -l myapp.jar看权限位) - 端口被占用(默认 8080):
lsof -i :8080或ss -tuln | grep 8080查冲突进程 - 配置文件缺失或路径错误:Spring Boot 默认找
application.properties在 classpath 根目录,若外置配置要用--spring.config.location=file:/etc/myapp/ - JVM 内存不足导致 OOM 闪退:加参数显式控制,例如
java -Xms512m -Xmx1024m -jar myapp.jar - 日志没输出就退出?加
--logging.level.org.springframework=DEBUG快速定位启动卡点
systemd 服务配置中容易漏掉的关键项
用 nohup 或 & 启动只是临时方案,生产环境必须用 systemd。但很多人配完发现服务起不来,或重启后环境变量失效,问题多出在以下几处:
-
User=必须指定非 root 用户(如myapp),否则WorkingDirectory和文件权限会混乱 -
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk"必须显式声明,systemd 不继承 shell 的$JAVA_HOME -
Restart=on-failure比always更合理:避免因配置错误无限重启,同时能自动拉起崩溃进程 -
RestartSec=10建议加上,防止频繁重启打满日志 - 别忘了
sudo systemctl daemon-reload && sudo systemctl enable myapp.service,否则start无效
为什么不用 WAR + Tomcat 而坚持 JAR 直接运行
Spring Boot 官方推荐 JAR 模式,不是情怀,是实际约束:
- WAR 模式需改
@SpringBootApplication继承SpringBootServletInitializer,还要改pom.xml的<packaging>war</packaging>和spring-boot-starter-tomcat的scope=provided—— 多一步就多一个出错点 - Tomcat 版本和 Spring Boot 内嵌 Tomcat 存在兼容风险(比如 Spring Boot 3.3.x 内置 Tomcat 10.1,但外部 Tomcat 9 就不兼容)
- JAR 模式下,
management.endpoints.web.exposure.include=*开启 Actuator 后,所有监控端点天然走同一端口,调试链路更短 - 容器化(Docker)场景下,JAR 是事实标准,WAR 反而要额外维护 Tomcat 镜像层
最常被忽略的一点:Spring Boot 的 JAR 是“fat jar”,它把所有依赖和内嵌容器打包在一起,所以你不需要、也不该去单独装 Tomcat 或 Jetty —— 那只会制造冲突。OpenJDK 装对版本,java -jar 跑起来,再用 systemd 托住,整条链路就稳了。


















