Tomcat部署WAR包时出现java.lang.ClassNotFoundException如何解决?
解决步骤
java.lang.ClassNotFoundException: api.OrderServlet 报错的核心是Tomcat的Web应用类加载器未在规定路径下找到对应类的编译文件,按以下步骤逐一排查即可解决:
1. 确认Web应用目录结构符合规范
手动部署的Tomcat Web应用必须遵守标准目录结构,你部署在Tomcat webapps 目录下的应用根目录(比如本次的咖啡订单服务可以命名为cafe)结构必须如下:
webapps/ └── cafe/ ├── WEB-INF/ │ ├── web.xml # Servlet核心配置文件 │ ├── classes/ # 存放所有你自己编译的class文件,严格按包路径创建子文件夹 │ │ ├── api/ │ │ │ └── OrderServlet.class │ │ └── data/ │ │ └── Order.class │ └── lib/ # 存放所有第三方依赖jar包,比如org.json的jar包、servlet-api之外的所有依赖都要放到该目录 └── 静态资源(如果有)
- 重点检查:编译后的
OrderServlet.class是否确实放在WEB-INF/classes/api/路径下,包路径和文件夹路径必须完全对应,大小写不能出错。 - 额外确认:代码中依赖的
org.json.JSONObject、Requests类对应的class或jar包也要放到对应路径,缺任何依赖都会间接触发类找不到报错。
2. 确认web.xml配置正确
WEB-INF/web.xml中关于OrderServlet的配置必须和类的全限定名完全匹配,参考配置如下:
<?xml version="1.0" encoding="UTF-8"?> <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"> <servlet> <servlet-name>OrderServlet</servlet-name> <!-- 此处必须写全限定类名,和类的package+类名完全一致,大小写不能错 --> <servlet-class>api.OrderServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>OrderServlet</servlet-name> <url-pattern>/orders/*</url-pattern> </servlet-mapping> </web-app>
3. 额外排查项
- 编译类用的JDK版本和Tomcat运行的JDK版本需要兼容,比如用JDK17编译的class无法在运行JDK8的Tomcat上加载。
- 编译用的servlet-api版本不要高于当前Tomcat支持的servlet版本,避免版本不兼容导致类加载失败。
- 所有配置修改完成后重启Tomcat,避免热部署缓存导致修改不生效。
内容的提问来源于stack exchange,提问作者N3ther
相关产品推荐
相关产品推荐

