We're migrating around 20 web contexts from Tomcat 6.0.48 to Tomcat 7.0.76 but we're facing an issue with the requests handled by the servlets configured in the parent web.xml
(tomcat7\conf\web.xml
). The problem is that requests for /some_file.html
, /some_file.jsp
, /images/some-image.jpg
, /index.xhtml
return a 404 NOT FOUND, while other custom servlets declared in the web.xml
of the context work fine. All 20 contexts are working fine in Tomcat 6 for years, but only 10 are failing on Tomcat 7. We have compared the ones that work with the ones that don't, but they are very different (unsurprisingly) and we haven't found the problem.
The tests
Projects are deployed using Eclipse under Windows, some test were executed deploying the WAR file directly on /webapps with the same results. All projects are Java 1.8 and they are mavenized. The tests consist in deploying one working context and one that does not work and navigate to: /some_file.html
, /some_file.jsp
, /images/some-image.jpg
and see if the response is 200 or 404.
- We've tried to match the version of javax.servlet.servlet-api (2.5 to 3.0.1) and javax.servlet.jsp.jsp-api (2.0 to 2.2) with the ones provided by Tomcat 7 in the dependencies (Parent POM). No change.
<dependency>
<groupId>javax.servlet</groupId>
<!-- <artifactId>servlet-api</artifactId>
<version>2.5</version> -->
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<!-- <version>2.0</version> -->
<version>2.2</version>
<scope>provided</scope>
</dependency>
- We've copied the default and jsp servlet mapping configuration from the
web.xml
file of Tomcat on theweb.xml
of the application. No change.
<!-- The mapping for the default servlet -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
- We've changed the url-pattern
/
to/*
in the tomcat'sweb.xml
file for the default servlet and things started to work with static resources but not for*.jsp
and*.xhtml
files (Faces). But as read in the servlet specification (JSR-315), it should work with/
. Either way, this change broke *.jsp requests for all contexts (¿?).
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
<servlet-name>default</servlet-name>
<url-pattern>/*</url-pattern>
- We've deleted all
servlet-mapping
andfilter-mapping
from theweb.xml
file of the context to see if there was any kind of conflict. No change.
We suspect that...
either the tomcat's web.xml
is not read, it's overwritten, or the url-pattern for /
and *.jsp
is broken by some contexts's descriptor.
Any clues?
Thanks in advance.