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

K8s部署SpringBoot报Jar扫描失败Pod启动BackOff问题求助

问题根因

这个报错和Kubernetes本身没有关系,Pod出现BackOff是因为Spring Boot应用启动时抛出未捕获的IOException直接退出,K8s按照重启策略不断重试导致的。核心触发原因有两个:

  • 依赖版本严重不匹配:Spring Boot 2.7.0内置的Tomcat版本为9.0.63,但你在pom.xml中手动指定了tomcat-jasper版本为9.0.33,同时引入的jstl 1.2、standard 1.1.2都是10年以上未更新的老旧依赖,和内置Tomcat版本完全不兼容。
  • OpenJDK18的兼容性问题:确实有大量开发者反馈在OpenJDK18上运行Spring Boot 2.7.x时遇到过完全一致的Jar扫描报错。JDK18修改了嵌套Jar包的URL协议处理逻辑,同时默认开启了类加载器并行加载,低版本Tomcat的StandardJarScanner组件没有适配该逻辑,扫描Spring Boot FatJar内BOOT-INF/lib目录下的嵌套Jar时,就会出现无法读取Jar根文件、抛出IOException的问题。
修复方案

按以下顺序调整配置即可解决:

  1. 对齐Tomcat相关依赖版本
    删除pom.xml中tomcat-jasper依赖手动指定的版本号,直接使用Spring Boot父POM统一管理的适配版本,不要硬编码和内置Tomcat不一致的版本号。修改后的依赖如下:
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-jasper</artifactId>
</dependency>
  1. 替换老旧JSTL依赖
    删除原有老旧的javax.servlet:jstl、taglibs:standard 1.1.2依赖,替换为官方维护的适配高版本JDK和Tomcat的标准实现,版本同样交给Spring Boot父POM管理,不要手动指定旧版本:
<dependency>
    <groupId>org.apache.taglibs</groupId>
    <artifactId>taglibs-standard-spec</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.taglibs</groupId>
    <artifactId>taglibs-standard-impl</artifactId>
</dependency>
  1. 清理冗余依赖
    pom中重复引入了2次org.json:json依赖,删除其中一个重复条目;同时spring-boot-devtools是本地开发用的热重载依赖,生产环境部署建议直接移除,避免额外的类加载逻辑引发未知问题。
  2. (可选)临时绕过方案
    如果暂时不想调整依赖,可以直接在Dockerfile的启动命令中添加JVM参数,让Tomcat跳过这些不需要扫描的Jar,直接绕过扫描报错:
ENTRYPOINT ["java","-Dtomcat.util.scan.StandardJarScanner.skipJars=spring-webmvc-*.jar,jstl-*.jar,taglibs-*.jar","-jar","/app.jar"]

调整完成后重新执行Maven打包、构建新的容器镜像,替换K8s集群中运行的旧镜像版本,应用即可正常启动,BackOff状态会自动消除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:51:30