Spring Boot 2.7.1升级Jetty 11无法运行抛出类不兼容错误如何解决
问题产生原因
抛出java.lang.IncompatibleClassChangeError: Class org.eclipse.jetty.webapp.WebAppContext$Context does not implement the requested interface javax.servlet.ServletContext的核心原因是版本依赖的规范不匹配,本质是Java EE到Jakarta EE的包名迁移带来的适配断层:
- Jetty 9.x基于Java EE技术栈构建,Servlet相关API全部使用
javax.servlet包路径;从Jetty 10开始,Jetty适配Jakarta EE规范,所有Servlet API的包名统一替换为jakarta.servlet,到Jetty 11.x版本时,其内部WebAppContext$Context类仅实现jakarta.servlet.ServletContext接口,完全没有实现旧javax.servlet包下的同名接口。 - Spring Boot 2.7.x整个版本线的Web模块都是基于Java EE的
javax.servlet规范做适配,不支持Jakarta EE的包名规则;Spring Boot直到3.0版本才完成全栈Jakarta EE迁移,默认内置适配的Jetty版本就是11.x。
在Spring Boot 2.7.1中强行替换Jetty依赖为11.x版本时,Spring启动时会按照javax.servlet.ServletContext接口匹配实现类,找到的Jetty 11的Context类不满足接口实现要求,直接抛出类不兼容错误。
适配解决方案
根据项目实际约束二选一即可:
- 最低成本方案:保留Spring Boot 2.7.1版本,不跨大版本升级Jetty到11.x,直接将Jetty依赖指定为9.x分支的最新安全补丁版本。Jetty官方对9.x分支的已知安全漏洞持续提供修复补丁,不需要升级到11.x即可解决安全问题,全程没有API兼容风险。
- 必须使用Jetty 11.x的方案:同步将Spring Boot升级到3.0及以上版本。Spring Boot 3.x原生适配Jakarta EE规范,默认集成的Jetty版本即为11.x,不存在接口不匹配问题。需要注意升级Spring Boot 3.x时,项目内所有依赖
javax.servlet包的第三方组件都要同步升级到支持Jakarta EE的版本,否则会触发同类的类兼容错误。
内容的提问来源于stack exchange,提问作者gauravbhatt13
相关产品推荐
相关产品推荐

