解决Tomcat下IntelliJ IDEA报错java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener

  笔者在做代码重构的时候,以前记得运行正常的代码,如今一直报错,百思不得其解。然后发现居然运行一个简单的程序也发生了同样的报错信息。当时笔者的运行环境如下:

笔者报错时的运行环境:

  • JDK 13.0.2

  • Spring 5.2.9.RELEASE

  • Maven 3.6.3

  • Tomcat 10.0.0(Servlet 5.0,JSP 3.0)

  • IntelliJ IDEA 2020.1.2 (Ultimate Edition)

  这个报错的信息如下:

xx-xxx-202X xx:xx:xx.xx 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.listenerStart 配置应用程序监听器[org.springframework.web.context.ContextLoaderListener]错误java.lang.NoClassDefFoundError: javax/servlet/ServletContextListenerat java.base/java.lang.ClassLoader.defineClass1(Native Method)at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:151)at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2431)at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:864)at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333)at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1187)at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:540)at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:521)at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:151)at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4589)at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5126)at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:706)at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1727)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:567)at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:288)at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:809)at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:427)at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:376)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:567)at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:288)at java.management/com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:809)at java.management/com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)at java.management/com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:468)at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1466)at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1307)at java.base/java.security.AccessController.doPrivileged(AccessController.java:691)at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1406)at java.management.rmi/javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:827)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:567)at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:359)at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)at java.base/java.security.AccessController.doPrivileged(AccessController.java:691)at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:562)at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:796)at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:677)at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:676)at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)at java.base/java.lang.Thread.run(Thread.java:830)Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContextListenerat org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1364)at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1187)... 56 more

  然后笔者针对一个简单的程序不断排错之后才发现,原来是 Servlet、JSP 与 Spring 的版本之间的匹配出了问题。众所周知,2018 年,Java EE 改名为 Jakarta EE。这导致一些 JAR 包的包名也在之后的版本中进行了更改。这对本项目的影响是,Spring 本身是不含 Servlet、JSP 的 JAR 包的,但其依赖这些 JAR 包。如果在 Tomcat 服务器中部署的项目使用了 Spring,则这部分的 JAR 包将由 Tomcat 服务器来提供。而问题在于,Spring 5.2.9.RELEASE 期望的 JAR 包前缀是 javax,而Tomcat 10.0.0 提供的 JAR 包前缀是 jakarta。因此,Spring 报了一个认为没有 Servlet、JSP 的 JAR 包的错。

(查看 Tomcat 的各版本对应的 Servlet 等的版本的网址是:http://tomcat.apache.org/whichversion.html)

  由于 Tomcat 与 Servlet、JSP 的 JAR 包关系密切,因此无法通过替换 Tomcat 下的文件夹 lib 中 Servlet、JSP 的 JAR 包来解决。而且这也无法通过在 Maven 中添加正确的 Servlet、JSP 依赖来解决,实际上,如果该工程的纯 Java 代码的部分没有使用到 Servlet、JSP 的 JAR 包,其实这里在 Maven 添加的 Servlet、JSP 依赖都可以删掉。(更专业的说法是,在基于 Maven 的 Web 应用中,对 Servlet、JSP 的依赖范围为 provided。)

  幸运的是,Tomcat 9.0.41 使用的 JAR 包前缀是 javax 。因此,这里只需要再安装一个Tomcat 9.0.41 即可解决(不需要卸载已有的 Tomcat,因为不同版本的 Tomcat 的安装路径可以不同,只是安装时需要先关闭已有的 Tomcat 服务器,避免占用同一个端口号)。

笔者成功运行时的运行环境:

  • JDK 13.0.2

  • Spring 5.2.9.RELEASE

  • Maven 3.6.3

  • Tomcat 9.0.41(Servlet 4.0,JSP 2.3)

  • IntelliJ IDEA 2020.1.2 (Ultimate Edition)

解决Tomcat下IntelliJ IDEA报错java.lang.NoClassDefFoundError: javax/servlet/ServletContextListener相关推荐

  1. SpringBoot 项目tomcat插件启动报错 java.lang.NoClassDefFoundError: javax/el/ELManager

    问题描述: SpringBoot项目 tomcat插件启动出现下面的问题: ERROR 2021-04-07 08:42:03,129 org.springframework.boot.SpringA ...

  2. JAVA第三方包导入但找不到类,解决:导入第三方包报错java.lang.NoClassDefFoundError:XXX.XXX,XXXXXX...

    报错信息如下,主要是导入androidpn测试client端,结果报错 04-02 16:28:34.325: E/dalvikvm(485): Could not find class 'org.a ...

  3. DRP问题集结(一)-Tomcat无法启动,报错java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory...

    问题一:  Tomcat无法启动,报错java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory 问题二:[Error]Jav ...

  4. Tomcat无法启动,报错java.lang.NoClassDefFoundError: or...

    今天使用Tomcat 7 时,发现Tomcat无法启动, 报错java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory 以为 ...

  5. WildFly 报错 java.lang.NoClassDefFoundError

    在eclipse上WildFly部署项目后,启动一直报错java.lang.NoClassDefFoundError,功夫不负有心人,终于解决. 解决方案 查了网上很多资料,有说环境变量配置不对的,有 ...

  6. Hive报错java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonFactory

    一 问题 Hive报错java.lang.NoClassDefFoundError:org/codehaus/jackson/JsonFactory 二 原因 Hadoop版本是0.20.2.$HAD ...

  7. SpringBoot+MyBatis启动报错java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal

    2019独角兽企业重金招聘Python工程师标准>>> 如题,在启动SpringBoot时报SpringBoot+MyBatis启动报错java.lang.NoClassDefFou ...

  8. SpringBoot运行出现异常解决: nested exception is java.lang.NoClassDefFoundError: javax/servlet/ServletContext

    今天在使用SpringBoot创建了一个项目出现如下异常 org.springframework.beans.factory.BeanCreationException: Error creating ...

  9. java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet

    文章目录 问题描述: 问题分析: jdk与Tomcat 解决问题: 方案一: 方案二: 补充 问题描述: 最近对JavaWeb进行了简单复习,在对照以往笔记写好了一个Servlet服务时发现无法启动该 ...

最新文章

  1. Linux--Ubuntu12.04下安装JDK
  2. 开发日记-20190710 关键词 读书笔记 《Perl语言入门》Day 7
  3. getContextPath、getServletPath、getRequestURI的区别
  4. ejb构建_如何使用单例EJB,Ehcache和MBean构建和清除参考数据缓存
  5. jar运行 osgi保存_自动化的OSGi测试运行程序
  6. 纯手写的css3正方体旋转效果
  7. Linux tm time_t timeval timespec以及与时间相关函数用法
  8. shiro使用jdbc_realm登录验证
  9. 前端工程师技能之photoshop巧用系列扩展篇——自动切图
  10. Java后端知识---数据结构(1)
  11. 【编译原理笔记14】中间代码生成:布尔表达式的回填,控制流语句的回填,switch语句的翻译,过程调用语句的翻译
  12. 关于Navicat 数据库一直激活不成功的解决方法
  13. 十大排序算法(C++版)
  14. Linux 之 vim 使用
  15. 十月百度,阿里巴巴,迅雷搜狗最新面试五十三题(持续更新中10.16)
  16. Codeforces Round #521 (Div. 3) E - Thematic Contests (二分 + STL)
  17. 美团大众点评合并:背后技术力量的对比回顾【转载+整理】
  18. 图书馆管理系统Python+MySQL+tkinter图形化界面+管理员登录+学生登录(注释详细)
  19. 淘宝吱口令效果实现,获取系统剪贴板内容
  20. 送你个低代码福利,错过要再等一年

热门文章

  1. 榴莲还有奶油、花生味 印尼出新品售价近7000人民币
  2. AESNI/XData勒索病毒来袭 目前主要在乌克兰传播 它居然还能使用硬件加速加密过程...
  3. 对Xcode菜单选项的详细探索
  4. 安卓自定义Listener
  5. 搞懂function(*args,**kwargs)
  6. 我爱的人,你知道我一直在
  7. SchemaCrawler 9.3 发布
  8. Delphi如何获取时间月份
  9. 南京大学与东南大学计算机学院,南京被“严重低估”的1所大学,拥有8个A+学科,无奈校名太普通...
  10. 深度linux卡顿,Deepin很卡怎么办?Deepin卡顿解决方法盘点