java.lang.NoClassDefFoundError

问题描述:

最近对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他们它们可以兼容吗?我们新建项目一步步的看:请添加图片描述
不难发现jdk1.8的Servlet支持版本为4.0.1
img
而我们去Tomcat下载目录里看10版本以上的Tomcat所使用的的Servlet版本请添加图片描述
请添加图片描述
得出结论,jdk1.8所依赖的Servlet版本为4.0,而Tomcat10.0.12依赖的Servlet版本为5.0,二者不匹配!
此时我们尝试将jdk版本由8上调至9:
请添加图片描述
发现jdk对Servlet依赖版本变成了5.0.0。但是改动jdk版本并不是我们的本意,此时就需要考虑降低Tomcat配置,使其匹配当前jdk
观察Tomcat9.0.54版本的配置文件:
请添加图片描述
请添加图片描述
发现Tomcat9.0.54版本所依赖的Servlet版本为4.0

解决问题:

方案一:

降低Tomcat版本使其依赖的Servlet版本与jdk所依赖的Servlet版本相匹配。
请添加图片描述

方案二:

提升jdk版本,目的同样是使Tomcat依赖的Servlet版本与jdk所依赖的Servlet版本相匹配请添加图片描述

补充

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

<!--此处为Tomcat9.0.54版本-->
<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">
123456

参考地址:https://blog.csdn.net/D_ps19990501/article/details/121604828

posted @ 2022-10-30 13:40  哩个啷个波  阅读(123)  评论(0编辑  收藏  举报