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
相关产品推荐
相关产品推荐

