Java Web Servlet出现ClassNotFound错误求助(需使用Java 8)
解决Tomcat中访问Servlet出现
ClassNotFoundException: javax.servlet.http.HttpServlet的问题 我的应用在Tomcat Web服务器上运行正常,但访问Java Web Servlet的URL /prepare_payment 时,出现如下错误:
SEVERE: Allocate exception for servlet [Servlet Name]
java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet
备注:必须使用Java 8。
相关配置代码
web.xml(非完整内容)
<?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>PreparePaymentServlet</servlet-name> <servlet-class>com.paybylink.wnm_paybylink_app.servlets.PreparePaymentServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>PreparePaymentServlet</servlet-name> <url-pattern>/prepare_payment</url-pattern> </servlet-mapping> <error-page> <error-code>404</error-code> <location>/not-found.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/error.jsp</location> </error-page> </web-app>
pom.xml(非完整内容)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.source>1.8</maven.compiler.source> <junit.version>5.9.2</junit.version> </properties> <dependencies> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>4.0.4</version> <scope>provided</scope> </dependency> <dependency> <groupId>jakarta.servlet.jsp</groupId> <artifactId>jakarta.servlet.jsp-api</artifactId> <version>3.1.1</version> <scope>provided</scope> </dependency> </dependencies> </project>
Servlet代码
@SuppressWarnings("serial") @WebServlet(name = "PreparePaymentServlet", urlPatterns = "/prepare_payment") public class PreparePaymentServlet extends HttpServlet { ... }
问题原因
核心冲突是Jakarta EE与Java EE的API包名不兼容:
- Java 8对应的Tomcat版本(如Tomcat 9)仅支持Java EE 8规范,提供的是
javax.servlet开头的API类。 - 你在pom.xml中引入的是Jakarta版本的Servlet API(
jakarta.servlet组),但代码中继承的是Java EE的javax.servlet.http.HttpServlet,导致运行时Tomcat无法找到对应类。
解决方案
1. 替换Servlet API依赖为Java EE版本
修改pom.xml中的依赖,将Jakarta版本换成Java EE规范的javax.servlet-api,版本适配Servlet 4.0(兼容Java 8和Tomcat 9):
<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> <scope>provided</scope> </dependency> </dependencies>
scope=provided保持不变,因为Tomcat自身已包含这些API,无需打包到WAR文件中。
2. 确认Servlet代码的导入路径
检查Servlet类的导入语句,确保使用Java EE的API:
import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @SuppressWarnings("serial") @WebServlet(name = "PreparePaymentServlet", urlPatterns = "/prepare_payment") public class PreparePaymentServlet extends HttpServlet { // 你的业务逻辑 }
3. 清理并重新构建项目
执行以下Maven命令,清理旧构建文件并重新打包:
mvn clean mvn package
随后将新生成的WAR包重新部署到Tomcat。
4. 可选:移除重复的Servlet配置
你的Servlet已经通过@WebServlet注解完成了URL映射,web.xml中的重复配置可能引发冲突,建议删除web.xml中以下内容:
<servlet> <servlet-name>PreparePaymentServlet</servlet-name> <servlet-class>com.paybylink.wnm_paybylink_app.servlets.PreparePaymentServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>PreparePaymentServlet</servlet-name> <url-pattern>/prepare_payment</url-pattern> </servlet-mapping>
内容的提问来源于stack exchange,提问作者Mhmd Korhani
相关产品推荐
相关产品推荐

