Tomcat10部署Apache CXF SOAP服务报NoClassDefFoundError错误
错误根因
Apache Tomcat 10.0及以上版本完成了Java EE到Jakarta EE的命名空间迁移,所有原javax.*前缀的Servlet、Java EE规范类全部改为jakarta.*前缀。你当前项目使用的CXF 3.4.x、Spring 5.x、javax.servlet-api依赖均基于旧javax命名空间开发,和Tomcat 10的运行环境不兼容,因此会抛出类找不到的错误。
解决方案
提供两种适配方案,可根据实际需求选择:
方案1:降级应用服务器到Tomcat 9.x(改动最小,适合快速修复)
Tomcat 9.x版本仍维持javax.*命名空间规范,和你当前项目的所有依赖完全兼容,直接将本地Tomcat 10替换为Tomcat 9最新稳定版即可正常部署。
方案2:升级项目依赖适配Tomcat 10的Jakarta规范(适合长期适配新环境)
需要全量替换pom.xml中的相关依赖,同时调整代码和配置:
- 替换Servlet API依赖:将原
javax.servlet-api替换为Jakarta版本:
<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency>
- 升级CXF版本到4.0.0及以上,该版本起支持Jakarta命名空间
- 升级Spring版本到6.0.0及以上,该版本起支持Jakarta命名空间
- 调整所有代码中的导入语句,将
import javax.servlet.*、import javax.jws.*等javax前缀的导入全改为对应jakarta前缀 - 调整web.xml、Spring配置文件中所有Servlet、Listener的类路径,将
javax开头的类全改为jakarta开头 - 替换旧的
tomcat7-maven-plugin为支持Tomcat 10的插件,或直接使用本地Tomcat 10进行部署
内容的提问来源于stack exchange,提问作者TSSK
相关产品推荐
相关产品推荐

