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的问题。
修复方案
按以下顺序调整配置即可解决:
- 对齐Tomcat相关依赖版本
删除pom.xml中tomcat-jasper依赖手动指定的版本号,直接使用Spring Boot父POM统一管理的适配版本,不要硬编码和内置Tomcat不一致的版本号。修改后的依赖如下:
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jasper</artifactId> </dependency>
- 替换老旧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>
- 清理冗余依赖
pom中重复引入了2次org.json:json依赖,删除其中一个重复条目;同时spring-boot-devtools是本地开发用的热重载依赖,生产环境部署建议直接移除,避免额外的类加载逻辑引发未知问题。 - (可选)临时绕过方案
如果暂时不想调整依赖,可以直接在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
相关产品推荐
相关产品推荐

