Apache Tomcat远程部署后Servlet返回404但本地正常问题
远程Tomcat Servlet 404问题排查与解决
你的问题核心是web.xml配置错误加上类路径不匹配,导致Servlet无法被Tomcat正确初始化,具体问题点和修复方案如下:
1. Servlet定义与映射不匹配
web.xml中第二个<servlet>节点的名称是TestServlet,但对应的<servlet-mapping>却使用了不存在的TestServletTwo作为名称,导致/test-two路径找不到对应的Servlet实例。
2. 类包名不一致
web.xml里配置的servlet-class是com.example.servlets.TestServlet,但实际TestServlet.java的包名是com.fourdcontrols.servlets,包名不匹配会让Tomcat找不到对应的class文件,直接引发404。
3. 重复定义Servlet节点
web.xml里重复定义了名称为TestServlet的<servlet>节点,这会导致容器初始化时出现混乱,干扰Servlet的正常加载。
4. 无效的contextPath配置
<context-param>中的contextPath参数对Tomcat完全无效,应用的上下文路径由war包名称(比如你的test-api.war对应/test-api)或server.xml中的<Context>配置决定,这个配置可以直接删除。
修正后的web.xml示例
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>Test API</display-name> <!-- 正确定义TestServlet,包名与代码保持一致 --> <servlet> <servlet-name>TestServlet</servlet-name> <servlet-class>com.fourdcontrols.servlets.TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping> <!-- 为/test-two路径配置对应的Servlet(需确保TestServletTwo类存在) --> <servlet> <servlet-name>TestServletTwo</servlet-name> <servlet-class>com.fourdcontrols.servlets.TestServletTwo</servlet-class> </servlet> <servlet-mapping> <servlet-name>TestServletTwo</servlet-name> <url-pattern>/test-two</url-pattern> </servlet-mapping> </web-app>
额外注意事项
- 确保war包中
WEB-INF/classes/com/fourdcontrols/servlets/路径下存在TestServlet.class和TestServletTwo.class文件,否则即使配置正确也会找不到类。 - 如果你使用
@WebServlet注解(代码中已有@WebServlet("/test")),可以选择去掉web.xml中的对应Servlet配置,避免重复配置引发冲突;若保留web.xml配置,建议统一使用XML方式管理所有Servlet映射。
内容的提问来源于stack exchange,提问作者Stewart LloydJones
相关产品推荐
相关产品推荐

