Spring Boot内嵌Tomcat环境出现ClientAbortException NoClassDefFoundError异常
异常原因分析
- 依赖冲突问题:你的pom中同时引入了Spring Boot默认带的嵌入式Tomcat依赖,以及compile范围的Jetty 11服务器依赖,两类Servlet容器的类存在加载优先级冲突。当偶发类加载器优先加载Jetty相关类、或者Tomcat类路径被覆盖时,就会找不到
org/apache/catalina/connector/ClientAbortException类定义。 - Spring Boot版本不兼容:父pom继承的Spring Boot版本为2.2.13.RELEASE,但是单独指定
spring-boot-starter-web版本为2.3.2.RELEASE,父子版本不匹配导致Tomcat依赖版本管理混乱,不同版本的Tomcat类定义存在差异,也会触发类找不到的问题。 - 场景触发逻辑:调用外部服务失败时通常伴随请求超时,客户端会提前断开连接,Tomcat此时需要抛出
ClientAbortException处理断开逻辑,刚好触发了前面的类加载冲突问题,所以异常只在该场景下偶发。
修复方案
- 移除不必要的Jetty依赖:你的代码中明确使用
TomcatServletWebServerFactory自定义Tomcat容器,不需要引入Jetty,直接删除pom中jetty-server和jetty-io两个依赖即可。 - 统一Spring Boot版本:要么将父pom的Spring Boot版本升级到和
spring-boot-starter-web匹配的2.3.x版本,要么删除spring-boot-starter-web的version标签,继承父pom的版本管理规则,避免版本不一致导致的依赖冲突。 - 若确实需要保留Jetty用于测试,将Jetty两个依赖的scope改为
test,避免生产环境加载Jetty相关类。
内容的提问来源于stack exchange,提问作者NitinM
相关产品推荐
相关产品推荐

