java.lang.NoClassDefFoundError
问题描述:
最近对JavaWeb进行了简单复习,在对照以往笔记写好了一个Servlet服务时发现无法启动该项目服务。针对java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet这个问题,百度结果有让导jar包的、有让提升IDEA版本的、有让重装Tomcat的,也有让修改项目中web.xml的,有些方法一看就不靠谱,于是我便尝试修改项目中web.xml版本,发现依旧不行,但从中却获得了灵感。
问题分析:
Tomcat原码是基于java,于是乎便联想到了Servlet、Tomcat、jdk之间是否存在着版本关联。果然在对Tomcat配置文件以及新建web项目时引入Servlet依赖版本分析时发现了问题。
jdk与Tomcat
目前项目开发常用的jdk版本依旧为1.8,而我最先选用的Tomcat版本为10.0.12,那么问题来了,2014年发布的jdk1.8和2020年发布的Tomcat10.0.0他们它们可以兼容吗?我们新建项目一步步的看:
不难发现jdk1.8的Servlet支持版本为4.0.1

而我们去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

浙公网安备 33010602011771号