Tomcat10部署Servlet提交表单触发ExceptionInInitializerError如何解决
问题根因
- 核心API不兼容:Tomcat 10及以上版本完成了Java EE到Jakarta EE的迁移,所有Servlet相关API的包名从原来的
javax.servlet.*全部改为jakarta.servlet.*。你当前的AddServlet代码导入的是旧版本javax.servlet下的HttpServlet、ServletRequest等类,和Tomcat 10运行环境提供的API完全不匹配,导致类加载失败触发ExceptionInInitializerError,Servlet容器无法完成Servlet实例化。 - 配置遗漏:你没有给AddServlet添加访问路径映射配置,既没有加
@WebServlet("/add")注解,也没有在web.xml中配置对应的Servlet映射,Tomcat无法将/add请求和对应Servlet类绑定。
解决方案
- 替换Servlet API依赖
如果是Maven项目,把原来的javax.servlet依赖替换为适配Tomcat 10的jakarta.servlet依赖:
<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency>
- 修正AddServlet的包导入与配置
把代码顶部所有import javax.servlet.*的导入语句全部替换为import jakarta.servlet.*,同时添加路径映射注解,修正后完整代码如下:
import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import java.io.IOException; @WebServlet("/add") public class AddServlet extends HttpServlet { public AddServlet() { } @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { int n1 = Integer.parseInt(req.getParameter("num1")); int n2 = Integer.parseInt(req.getParameter("num2")); int out = n1 + n2; System.out.println("Output: " + out); } }
- 检查部署配置
确认IntelliJ的Tomcat运行配置中,项目 artifacts 已经正确部署,WEB-INF/classes目录下已经编译生成了AddServlet的class文件。 - 可选降级方案
如果不想修改API包名,可以降级使用Tomcat 9及以下版本,这些版本仍然兼容javax.servletAPI。
内容的提问来源于stack exchange,提问作者milanHrabos
相关产品推荐
相关产品推荐

