You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Servlet路由无法识别:Tomcat返回404错误求助

排查Servlet 404错误的核心要点

1. Tomcat与JDK版本不兼容

Tomcat 9.0仅支持JDK 8到JDK 11,你用的JDK 17超出了它的兼容范围,会直接导致类加载、注解解析等核心功能异常,Servlet自然无法被识别。要么换成Tomcat 10.0+版本(支持JDK 17),要么把JDK降级到11及以下。

2. 项目结构是否符合Maven规范

  • 确保Servlet类放在src/main/java下的包路径里,别丢去src/main/resources或其他目录
  • 检查src/main/webapp目录必须存在,web.xml得放在src/main/webapp/WEB-INF下面
  • 去target目录看看有没有生成classes文件夹,你的MyServlet.class文件得在对应包路径里

3. pom.xml配置踩坑点

  • 必须把打包方式设为war:
    <packaging>war</packaging>
    
  • Servlet依赖的scope要设为provided,因为Tomcat自带Servlet API,别用其他scope:
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    
  • 如果用Tomcat Maven插件,要保证插件版本和Tomcat服务器匹配,同时上下文根配置要和你访问的一致:
    <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat9-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
            <path>/server</path> <!-- 和你访问的http://localhost:8080/server里的/server对应 -->
        </configuration>
    </plugin>
    

4. Servlet类与注解的细节检查

  • 确认MyServlet正确继承HttpServlet,并且重写了doGet/doPost方法:
    public class MyServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.getWriter().write("Hello Servlet");
        }
    }
    
  • 注解要导入正确的包:Tomcat9用javax.servlet.annotation.WebServlet,别用Tomcat10+才支持的Jakarta EE包
  • 注解路径没问题的话,访问路径http://localhost:8080/server/servlet要对应上下文根/server和注解里的/servlet

5. web.xml配置的注意事项

  • 要是用web.xml映射,得保证文件版本是Servlet 3.0+(比如version="3.1"),不然不支持注解:
    <?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_3_1.xsd"
             version="3.1">
        <servlet>
            <servlet-name>MyServlet</servlet-name>
            <servlet-class>com.example.MyServlet</servlet-class> <!-- 必须写完整的包+类名 -->
        </servlet>
        <servlet-mapping>
            <servlet-name>MyServlet</servlet-name>
            <url-pattern>/servlet</url-pattern>
        </servlet-mapping>
    </web-app>
    
  • servlet-class一定要写完整的包路径,比如类在com.test下,就写com.test.MyServlet,不能只写MyServlet

6. Tomcat部署与启动验证

  • 看Tomcat启动日志,有没有类加载失败、Servlet初始化报错的信息(比如ClassNotFoundException)
  • 检查Tomcat的webapps目录下,有没有部署你的war包或解压后的文件夹,文件夹名称得是server(对应上下文根)
  • VSCode里配置Tomcat时,确认部署的项目路径正确,上下文根设成了/server

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 21:00:18