运行Java Servlet报java.lang.ClassNotFoundException异常如何解决
问题原因
- 缺少编译后的Servlet类文件:Tomcat类加载器只会识别
WEB-INF/classes目录下的编译后.class文件,你当前仅在源码目录存放了AddServlet.java源文件,未将编译生成的AddServlet.class放入WEB-INF/classes/demo/app/路径下,导致类加载失败。 - web.xml版本与运行环境不兼容:你使用的Tomcat 10+Servlet 5属于Jakarta EE规范,而当前web.xml用的是旧的J2EE 2.4版本规范,版本不匹配会导致Servlet配置加载异常。
- 项目目录结构不符合规范:当前你将Java源码直接放在src根目录,不符合标准Web项目的源码存放规则,会导致编译工具无法自动将编译后的类文件输出到正确路径。
解决方法
- 调整项目为标准Maven Web项目结构,修改后的结构如下:
└── src ├── main │ ├── java │ │ └── demo │ │ └── app │ │ └── AddServlet.java │ └── webapp │ ├── META-INF │ ├── WEB-INF │ │ ├── classes (编译后的.class文件将自动输出到该目录) │ │ ├── lib │ │ └── web.xml │ └── demo.html
- 替换web.xml内容为适配Servlet 5的配置:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"> <servlet> <servlet-name>abc</servlet-name> <servlet-class>demo.app.AddServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>abc</servlet-name> <url-pattern>/add</url-pattern> </servlet-mapping> </web-app>
- 编译Java源码,确保编译生成的
demo/app/AddServlet.class文件存放在WEB-INF/classes对应路径下,使用IDEA、Eclipse等IDE的情况下,修正结构后IDE会自动完成编译和类文件输出操作。 - 重新部署项目到Tomcat,重启服务后即可正常访问。
内容的提问来源于stack exchange,提问作者Kumar_Maddy
相关产品推荐
相关产品推荐

