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