You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行中替换Spring Boot Jar包可行吗?Linux部署遇问题求解决方案

Spring Boot 覆盖Jar包部署问题解决办法

问题根源

Spring Boot可执行Jar采用嵌套压缩结构,JVM启动时会持续读取Jar内的类与资源文件。如果在应用运行中(或重启前直接覆盖Jar包),会导致JVM读取到不完整/损坏的文件内容——Linux下的文件覆盖不是原子操作,Jar包的部分字节可能已被修改,重启时JVM加载的Jar处于不一致状态,从而引发挂起、ClassNotFoundException等异常。

解决方法

1. 标准替换流程:先停服再替换

确保JVM完全退出后再替换Jar包,避免文件锁和内容不一致问题,推荐用原子性的mv操作替换(而非cp覆盖):

# 停止应用(假设通过pid文件管理进程)
kill $(cat app.pid)
# 备份旧Jar
mv app.jar app.jar.old
# 替换为新Jar
mv new-app.jar app.jar
# 重启应用并记录pid
java -jar app.jar & echo $! > app.pid

2. 启用解压运行模式(类似WAR包方式)

Spring Boot支持将可执行Jar解压后运行,彻底避免直接操作压缩Jar的问题,有两种方式:

手动解压启动

先将Jar解压到指定目录,再从解压目录启动:

# 解压Jar到指定目录
unzip app.jar -d app-working-dir
# 从解压目录启动应用
java -cp app-working-dir org.springframework.boot.loader.JarLauncher

后续部署新版本时,只需替换整个解压目录,再重启应用即可。

自动解压启动(Spring Boot 2.3+)

启动Jar时添加--extract参数,Spring Boot会自动将Jar解压到临时目录(或指定目录)并运行:

# 默认解压到系统临时目录运行
java -jar app.jar --extract
# 指定自定义解压目录
java -jar app.jar --extract --extract-dir=/opt/myapp/extracted

注意:每次启动都会校验解压目录内容,若与原Jar不一致会重新解压;部署新版本时仍需替换原Jar后重启,或直接替换解压目录内容再重启。

3. 版本化Jar+软链接方案

给Jar包添加版本号后缀,用软链接指向当前运行版本,替换时仅更新软链接:

# 部署新版本Jar
mv new-app.jar app-v2.0.jar
# 更新软链接指向新版本
ln -sf app-v2.0.jar app.jar
# 重启应用
kill $(cat app.pid) && java -jar app.jar & echo $! > app.pid

这种方式能避免覆盖文件的风险,还便于回滚(只需切换软链接到旧版本再重启)。

内容的提问来源于stack exchange,提问作者Theo Lassonder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:35:16