Tomcat 9.0.40部署Web应用后返回404问题求助
排查Tomcat部署后404错误的关键要点
看起来你已经做了不少基础配置,但还是遇到了404问题,我来帮你梳理几个容易遗漏的排查方向:
1. 确认JAX-RS的核心配置是否到位
Tomcat 9本身并不自带JAX-RS的实现,所以你需要确保两个关键配置:
- 必须有一个
Application子类或@ApplicationPath注解:这个类是JAX-RS的入口,告诉Tomcat哪里去找你的Web服务资源。比如:
如果没有这个类,Tomcat根本不知道如何映射你的REST接口,自然返回404。import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("/") // 这里的路径对应你要访问的基础路径 public class TopicsApplication extends Application { // 空类即可,Tomcat会自动扫描当前包下的JAX-RS资源类 } - 检查WEB-INF/lib下的JAX-RS依赖:需要引入JAX-RS的API包和实现包(比如Jersey的
jaxrs-ri相关jar),如果依赖缺失,资源类无法被加载,日志里会出现ClassNotFoundException。
2. 验证Web应用的实际部署内容
Eclipse的部署有时候会有“看起来部署了但实际文件不对”的情况:
- 去你指定的
webapps/projects-topics-ws/WEB-INF/classes目录下,检查是否有编译后的Java类(特别是你的JAX-RS资源类和Application类)。如果这里是空的或者类文件缺失,说明Eclipse的编译或部署步骤出了问题。 - 确认Eclipse的Server Locations设置:双击Tomcat服务器,查看"Server Locations"区域,是否选择了
Use Tomcat installation (takes control of Tomcat installation)。如果选的是工作空间元数据,实际部署目录是Eclipse工作空间的.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps,而不是Tomcat安装目录的webapps,这时候你看到webapps里的项目可能是旧的,实际运行的是另一份文件。
3. 检查Context配置是否冲突
你在server.xml里手动配置了<Context>元素,但Tomcat的autoDeploy="true"会自动生成上下文配置文件(在conf/Catalina/localhost/目录下,比如projects-topics-ws.xml),这可能导致配置冲突:
- 建议删除
server.xml里手动添加的<Context>节点,让Eclipse自动管理上下文配置,避免重复配置引发的路径映射问题。 - 查看
conf/Catalina/localhost/下是否有对应项目的xml文件,确认其中的docBase和path是否和你预期的一致。
4. 核对资源类的路径注解
你的预期是访问http://localhost:8087/projects-topics-ws/返回XML,那需要确保:
- 你的JAX-RS资源类上的
@Path注解是"/",或者方法上的@Path是"/",比如:
如果资源类的import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/") public class TopicsResource { @GET @Produces(MediaType.APPLICATION_XML) public String getTopics() { return "<topics><topic>Test</topic></topics>"; } }@Path是"/api",那你需要访问http://localhost:8087/projects-topics-ws/api/才能得到预期结果。
5. 查看Tomcat日志找线索
日志是排查问题最直接的方式:
- 打开Tomcat的
logs目录,查看localhost.log、catalina.out或者localhost_access_log.*.txt,有没有类加载失败、初始化异常等错误信息。比如如果JAX-RS依赖缺失,日志会明确提示找不到某个类;如果资源类初始化出错,也会有对应的堆栈信息。
6. 测试静态资源是否可访问
先排除路径映射本身的问题:在webapps/projects-topics-ws下新建一个test.html文件,访问http://localhost:8087/projects-topics-ws/test.html。如果这个静态文件能正常访问,说明Tomcat的上下文映射是正常的,问题出在JAX-RS的配置或资源类上;如果静态文件也404,那就是部署或上下文配置的问题。
内容的提问来源于stack exchange,提问作者ulrich




