You need to enable JavaScript to run this app. Java Web启动Tomcat报无法强转jakarta.servlet.Servlet问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

Java Web启动Tomcat报无法强转jakarta.servlet.Servlet问题咨询

报错根因

核心问题是编译期Servlet API与运行期Servlet运行时的包名完全不匹配:

  • 你编写的HelloServlet继承自javax.servlet.http.HttpServlet,属于Servlet 4.0及更早版本的API定义
  • 当前启动的Tomcat为10.0及以上版本,该版本对应Servlet 5.0+规范,已将所有原javax.servlet包迁移为jakarta.servlet包,运行时仅识别jakarta.servlet包下的Servlet实现类
  • 两个包下的Servlet接口是完全独立的类类型,不存在实现/继承关系,强转时直接抛出类型不匹配错误

验证方法

  • 查看Tomcat安装目录lib下的Servlet相关jar包:若存在jakarta.servlet-api-*.jar,则确认是Tomcat 10+版本
  • 查看项目依赖:若引入的是javax.servlet-api,则编译生成的类会关联javax包下的Servlet定义,与运行时环境不兼容

修复方案

二选一即可:

方案一:适配现有javax代码,使用低版本Servlet生态

  • 将Tomcat降级至9.x及以下版本(对应Servlet 4.0,沿用javax包规范)
  • 确认项目引入的Servlet依赖为javax.servlet-api,版本匹配4.0及以下

方案二:适配现有Tomcat 10+环境,升级为jakarta生态

  • 将代码中所有javax.servlet开头的导入替换为jakarta.servlet开头的对应类
  • 项目依赖替换为jakarta.servlet-api,版本对应5.0及以上

替换后的代码示例:

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello servlet");
        PrintWriter writer = resp.getWriter();
        writer.print("hello,servlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

内容的提问来源于stack exchange,提问作者Wendy Yu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 17:54:04