28

I write a Java servlet that I want to install on many instances of Tomcat on different servers. The servlet uses some static files that are packed with the war file under WEB-INF. This is the directory structure in a typical installation:

- tomcat
-- webapps
--- myapp
---- index.html
---- WEB-INF
----- web.xml
----- classes
------ src
------- .....
----- MY_STATIC_FOLDER
------ file1
------ file2
------ file3

How can I know the absolute path of MY_STATIC_FOLDER, so that I can read the static files?

I cannot rely on the "current folder" (what I get in a new File(".")) because it depends on where the Tomcat server was started from, which is different in every installation!

BalusC
  • 992,635
  • 352
  • 3,478
  • 3,452
Erel Segal-Halevi
  • 26,318
  • 26
  • 92
  • 153

3 Answers3

43

You could use ServletContext#getRealPath() to convert a relative web content path to an absolute disk file system path.

String relativeWebPath = "/WEB-INF/static/file1.ext";
String absoluteDiskPath = getServletContext().getRealPath(relativeWebPath);
File file = new File(absoluteDiskPath);
InputStream input = new FileInputStream(file);
// ...

However, if your sole intent is to get an InputStream out of it, better use ServletContext#getResourceAsStream() instead because getRealPath() may return null whenever the WAR is not expanded into local disk file system but instead into memory and/or a virtual disk:

String relativeWebPath = "/WEB-INF/static/file1.ext";
InputStream input = getServletContext().getResourceAsStream(relativeWebPath);
// ...

This is much more robust than the java.io.File approach. Moreover, using getRealPath() is considered bad practice.

See also:

BalusC
  • 992,635
  • 352
  • 3,478
  • 3,452
-1

You can try this
String relativeWebPath = "WEB-INF/static/file1.ext";
InputStream input = getServletContext().getResourceAsStream(relativeWebPath);

Rakesh
  • 3,841
  • 3
  • 25
  • 55
  • @BalusC, I didn't see the previous answer while i was logged in, may be both of us posted the answer around the same time... well since your answer has been posted before mine, you deserve an up vote.. :) – Rakesh Jul 07 '11 at 08:17
-2

I would prefer to use the getResourceaAsStream option to load the resource based on the parent directory.

getClass().getClassLoader().getResourceAsStream("/MY_STATIC_FOLDER/file1");
rit
  • 2,258
  • 3
  • 17
  • 26