Cómo encontrar la carpeta de trabajo de una aplicación basada en servlet para cargar recursos

Escribo un servlet de Java que quiero instalar en muchas instancias de Tomcat en diferentes servidores. El servlet usa algunos archivos estáticos que están empaquetados con el archivo war en WEB-INF. Esta es la estructura de directorios en una instalación típica:

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

¿Cómo puedo saber la ruta absoluta de MY_STATIC_FOLDER, para que pueda leer los archivos estáticos?

No puedo confiar en la “carpeta actual” (lo que obtengo en un nuevo archivo (“.”)) Porque depende de dónde se inició el servidor Tomcat, que es diferente en cada instalación.

Puede usar ServletContext#getRealPath() para convertir una ruta de contenido web relativa en una ruta de sistema de archivos de disco absoluta.

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

Sin embargo, si su única intención es obtener un InputStream , mejor use ServletContext#getResourceAsStream() lugar como getRealPath() puede devolver null siempre que WAR no se expanda en el sistema de archivos del disco local (Tomcat lo hace de manera predeterminada, pero es configurable para no hacerlo!):

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

Después de todo, esto es mucho más sólido que el enfoque java.io.File .

Ver también:

  • getResourceAsStream () vs FileInputStream
  • ¿Qué significa servletcontext.getRealPath (“/”) y cuándo debería usarlo?
  • ¿Dónde colocar y cómo leer los archivos de recursos de configuración en la aplicación basada en servlet?
  • Forma recomendada para guardar archivos cargados en una aplicación servlet

Preferiría usar la opción getResourceaAsStream para cargar el recurso basado en el directorio principal.

 getClass().getClassLoader().getResourceAsStream("/MY_STATIC_FOLDER/file1"); 

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