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

Tomcat 10部署WAR文件报NoClassDefFoundError: ServletContextListener类缺失

java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener
            at java.lang.ClassLoader.defineClass1(Native Method)
            at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
            at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
            at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2517)
            at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:872)
            at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1408)
            at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1252)
报错核心原因

Tomcat 10及以上版本基于Jakarta EE 9+规范实现,该规范将原Java EE的javax.*包名统一重命名为jakarta.*,因此Tomcat 10内置的Servlet API不再提供javax.servlet开头的类。你部署的WAR包是基于旧版Java EE规范开发的,代码或依赖中引用了javax.servlet.ServletContextListener类,运行时Tomcat找不到对应类就会抛出该NoClassDefFoundError错误。

可行的解决方案
  • 方案一:降级使用Tomcat 9或更低版本,这类版本仍然兼容javax.*命名空间的Servlet API,无需修改现有代码即可直接部署运行。
  • 方案二:迁移现有项目适配Jakarta EE规范,将项目中所有javax.*开头的API引用全部替换为jakarta.*,同时调整Maven/Gradle等构建配置中的Servlet、JSP等相关依赖为Jakarta EE兼容版本,重新打包后即可部署到Tomcat 10。
  • 方案三:使用Tomcat官方提供的包名迁移工具,直接对现有WAR包进行批量替换处理,工具会自动修改包内的类、配置文件中的javax.*引用为jakarta.*,处理完成的WAR包可直接在Tomcat 10上运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 08:51:04