Tomcat directly serve static (css, js) files shared by multiple applications
I'm using the ExtJS framework which has a bulk of js
and css
files that are used for all apps. I intend to share these between a number of web applications (different war
files).
For this reason I would like to serve ExtJS js
and css
directly from the web server, in my case Tomcat6
, which can be used to serve static files, as in this helpful link.
Therefore I put my files under /var/lib/tomcat6/webapps/ROOT/extjs/
. The static files that are directly under that directory are served correctly, e.g. /extjs/ext.js
correctly serves the file at /var/lib/tomcat6/webapps/ROOT/extjs/ext.js
.
However files in lower-level directories, for example /extjs/welcome/css/welcome.css
, which should serve the file at /var/lib/tomcat6/webapps/ROOT/extjs/welcome/css/welcome.css
, return a 404
.
TL/DR
Tomcat serves static files only at top-level directory. A 404
is returned for files deeper in the hierarchy.
Config file contents:
- server.xml
- application's web.xml
FIXED - SOLUTION:
The issue was that I was placing the clause:
<Context docBase="/path/to/extjs-static-files" path="/extjs"/>
within Tomcat's server.xml
<Engine>
clause. Once I placed it within the <Host>
tag it started working. Reading this doc was very helpful in identifying what I was doing wrong.
I'm running a RESTful web service that serves some static content stored in a directory outside of Tomcat. The directory is specified by a servlet parameter in web.xml You could do something similar and just specify an absolute path to the files you need - place them in Tomcat somewhere or wherever road you like. I can post some sample code if you like. Of course all other files that reference the javascript and CSS would need to change because these files will be at a different URL directory than the web apps that use them. For instance, src="restAppContextName/serve/youJavaScript.js" where serve is a @Path for the REST web service and whatever follows is a @PathParam. To the browser, /serve will be treated like it's a directory, so a relative reference from one js file to another should work.