Tomcat6迁移至Tomcat7时默认与JSP servlet请求返回404问题咨询
排查步骤
1. 检查应用web.xml的根配置
- 确认
<web-app>标签的版本声明符合Servlet 3.0规范,错误的旧版本DTD声明会触发Tomcat兼容模式,导致全局配置继承异常:
<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">
- 检查是否配置了
<metadata-complete>true</metadata-complete>,该属性会强制Tomcat仅读取应用自身web.xml的配置,跳过全局conf/web.xml的内容合并,可暂时改为false或删除该配置测试。
2. 排查注解类的隐式配置覆盖
Servlet 3.0支持通过@WebServlet、@WebFilter注解注册组件,你此前仅删除了应用web.xml中的显式配置,未覆盖依赖Jar包中的注解类:
- 临时在
conf/catalina.properties中添加配置org.apache.catalina.core.StandardContext.ANNOTATION_SCAN_DISABLED=true,禁用所有注解扫描后重启Tomcat测试。 - 如果问题解决,说明存在Jar包中的注解类注册了
urlPatterns="/"或urlPatterns="/*"的Servlet/Filter,覆盖了全局default、jsp Servlet的映射,可通过<absolute-ordering>标签限定扫描范围或排除对应Jar包解决。
3. 开启调试日志确认映射加载情况
修改conf/logging.properties,添加如下配置开启Servlet映射加载日志:
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = FINE
重启Tomcat后查看localhost.yyyy-MM-dd.log,对比正常/异常应用启动时的Servlet映射列表:
- 确认异常应用是否存在
defaultServlet的/映射、jspServlet的*.jsp/*.jspx映射 - 确认是否存在优先级更高的
/*路径映射拦截了静态资源、JSP请求(Servlet映射优先级:精确匹配>路径匹配>扩展名匹配>缺省Servlet)
4. 排查Context类加载与配置
检查异常应用META-INF/context.xml、Tomcat全局conf/context.xml、conf/server.xml中对应Context的配置:
- 确认未配置
delegate="true"导致JSP Servlet类加载异常 - 确认未配置
defaultServletName、jspServletName参数覆盖了全局默认Servlet名称
5. 差异化对比定位问题
- 将正常应用的web.xml完全替换异常应用的web.xml,测试是否恢复,逐步替换配置项定位异常配置
- 若web.xml替换后仍异常,将正常应用的
WEB-INF/lib目录替换异常应用的lib目录,逐步排查是否为依赖Jar包差异导致
6. JSF(*.xhtml)专属排查
确认异常应用的JSF依赖版本与正常应用一致,Tomcat7本身不自带JSF实现,需确保jsf-api、jsf-impl包已打入WAR包,且FacesServlet的*.xhtml映射未被其他配置覆盖。
内容的提问来源于stack exchange,提问作者Dani Rodríguez
相关产品推荐
相关产品推荐

