Search code examples
javatomcatwarservlet-3.0getresource

Does ServletContext.getRealPath() work with web fragments?


I use web fragments (servlet 3 spec) and thus can load e.g. META-INF/resources/access.xml file which is in a library in /WEB-INF/lib/ of my WAR via ServletContext.getResourceAsStream("access.xml").

Doing the same with ServletContext.getRealPath("access.xml") doesn't work (=> null).

The spec states:

The getRealPath method takes a String argument and returns a String representation of a file on the local file system to which a path corresponds. Resources inside the META-INF/resources directory of JAR file must be considered only if the container has unpacked them from their containing JAR file when a call to getRealPath() is made, and in this case MUST return the unpacked location.

My container (Tomcat) didn't unpack the jars, this seems to be the problem? How can Tomcat unpack the jars. Should I unpack the jars when packaging the WAR?


Solution

  • Yes, getResourcesAsStream() always works. But getRealPath() doesn't.

    Answer: Don't try to use getRealPath() together with web fragments.