springboot小案例默认应打包为可执行jar:需配置spring-boot-maven-plugin触发repackage目标,生成含boot-inf目录和jarlauncher入口的fat jar,确保java -jar能直接启动且内嵌tomcat运行。

直接用 java -jar 运行可执行 JAR 是最简方式
只要你的 JAR 包是通过 Maven 的 maven-jar-plugin 或 Spring Boot 的 spring-boot-maven-plugin 打包出来的(即 MANIFEST.MF 中含 Main-Class 或 Start-Class),就能直接运行:
java -jar myapp.jar
注意三点:
- 必须确保
JAVA_HOME指向的是你期望的 OpenJDK 版本(比如/usr/local/java/default),否则可能意外调用系统自带旧版 JDK - 如果报
UnsupportedClassVersionError,说明打包时用的 JDK 版本高于当前运行环境——不是“Java 装错了”,而是版本不匹配 - 前台运行会阻塞终端;生产环境务必加
nohup或交给systemd管理,否则关掉 SSH 就退出
用 systemd 管理 Java 服务才能真正高可用
手动 nohup java -jar ... & 只适合临时调试。生产环境必须用 systemd 实现自动拉起、崩溃重启、日志归集。
写一个 /etc/systemd/system/myapp.service:
[Unit] Description=My Java Application After=network.target [Service] Type=simple User=appuser WorkingDirectory=/opt/myapp ExecStart=/usr/bin/java -Xms512m -Xmx2g -jar /opt/myapp/myapp.jar Restart=on-failure RestartSec=10 Environment="JAVA_HOME=/usr/local/java/default" [Install] WantedBy=multi-user.target
关键点:
-
ExecStart必须写绝对路径,/usr/bin/java比单纯写java更可靠,避免 PATH 污染 - 显式设置
JAVA_HOME环境变量,防止某些库(如 JNI 组件)找不到运行时 - 不要在
ExecStart里加&——systemd会认为进程立即退出,导致启动失败 - 首次启用后要执行
sudo systemctl daemon-reload && sudo systemctl enable --now myapp
WAR 包部署到 Tomcat 前必须核对 JDK/Tomcat 版本兼容性
Tomcat 10 要求最低 JDK 11,且只支持 Jakarta EE 9+(即包名从 javax.* 改为 jakarta.*)。如果你的 WAR 是用 Spring Boot 2.x(基于 Servlet 4.0)打的,硬塞进 Tomcat 10 就会报 ClassNotFoundException: javax.servlet.http.HttpServlet。
解决办法只有两个:
- 降级用 Tomcat 9(支持
javax.*,兼容 JDK 8+) - 升级应用:Spring Boot 3.x + Jakarta EE 9+ 兼容层,同时改
pom.xml里的依赖坐标(javax.servlet→jakarta.servlet)
别信“改个配置就能混用”——这是线上最常被跳过的兼容性检查点。
打包时嵌入 JRE 是简化分发但代价明确
用 jpackage(JDK 14+)或第三方工具(如 Launch4j)可以把 OpenJDK 运行时和你的 JAR 打成一个目录甚至安装包。好处是用户不用装 JDK;坏处是:
- 体积暴涨(一个最小化 JRE 也超 100MB)
- 安全更新要重打包,无法复用系统统一的 JDK 补丁机制
-
jpackage在 Linux 上默认生成 rpm/deb,但若目标机器没对应包管理器(如 Alpine),就得切回--type app-image生成解压即用目录
除非交付给完全无运维能力的终端客户,否则不建议在服务器环境这么做。
最易被忽略的一点:所有这些部署方式都依赖 JAVA_HOME 的一致性。哪怕你用 systemd 显式指定了 java 路径,某些 JVM 参数(如 -XX:+UseContainerSupport)或监控代理(如 Prometheus JMX Exporter)仍会读取 JAVA_HOME 下的 lib/ 和 conf/。路径错一点,就可能漏掉 GC 日志配置或 TLS 证书信任库。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











