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

文章目录

      • 问题描述:
      • 问题分析:
        • jdk与Tomcat
      • 解决问题:
        • 方案一:
        • 方案二:
        • 补充

问题描述:

最近对JavaWeb进行了简单复习,在对照以往笔记写好了一个Servlet服务时发现无法启动该项目服务。针对java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet这个问题,百度结果有让导jar包的、有让提升IDEA版本的、有让重装Tomcat的,也有让修改项目中web.xml的,有些方法一看就不靠谱,于是我便尝试修改项目中web.xml版本,发现依旧不行,但从中却获得了灵感。

问题分析:

Tomcat原码是基于java,于是乎便联想到了ServletTomcatjdk之间是否存在着版本关联。果然在对Tomcat配置文件以及新建web项目时引入Servlet依赖版本分析时发现了问题。

jdk与Tomcat

目前项目开发常用的jdk版本依旧为1.8,而我最先选用的Tomcat版本为10.0.12,那么问题来了,2014年发布的jdk1.82020年发布的Tomcat10.0.0他们它们可以兼容吗?我们新建项目一步步的看:java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet_第1张图片
不难发现jdk1.8的Servlet支持版本为4.0.1
java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet_第2张图片
而我们去Tomcat下载目录里看10版本以上的Tomcat所使用的的Servlet版本java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet_第3张图片
java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet_第4张图片
得出结论,jdk1.8所依赖的Servlet版本为4.0,而Tomcat10.0.12依赖的Servlet版本为5.0,二者不匹配!
此时我们尝试将jdk版本由8上调至9:
java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet_第5张图片
发现jdk对Servlet依赖版本变成了5.0.0。但是改动jdk版本并不是我们的本意,此时就需要考虑降低Tomcat配置,使其匹配当前jdk
观察Tomcat9.0.54版本的配置文件:
java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet_第6张图片
java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet_第7张图片
发现Tomcat9.0.54版本所依赖的Servlet版本为4.0

解决问题:

方案一:

降低Tomcat版本使其依赖的Servlet版本与jdk所依赖的Servlet版本相匹配。
java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet_第8张图片

方案二:

提升jdk版本,目的同样是使Tomcat依赖的Servlet版本与jdk所依赖的Servlet版本相匹配java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet_第9张图片

补充

在解决此问题时尽可能不要改动jdk版本。另外为了避免不必要麻烦,项目中的web.xml头文件尽可能和Tomcat保持一致


<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

你可能感兴趣的:(Web开发,java,tomcat,servlet,javaweb)