java - life - tomcat 5.5-problema con la lectura de archivos de recursos
tomcat java 8 (5)
Estoy usando Tomcat 5.5 como mi contenedor de servlets. Mi aplicación web se implementa mediante .jar y tiene algunos archivos de recursos (archivos de texto con cadenas y parámetros de configuración) ubicados en su directorio WEB-INF. Tomcat 5.5 se ejecuta en Ubuntu Linux. El archivo de recursos se lee con un lector de archivos:
fr = new FileReader("messages.properties");
El problema es que a veces el servlet no puede encontrar el archivo de recursos, pero si lo reinicio un par de veces funciona, luego de nuevo después de un tiempo deja de funcionar. ¿Puede alguien sugerir cuál es la mejor manera de leer cadenas de recursos de un servlet? O una solución para este problema? Poner los archivos de recursos en WEB-INF / classes tampoco ayuda.
Si utiliza
new FileReader("message.properties");
Luego, FileReader intentará leer ese archivo desde el directorio base, que en Tomcat probablemente sea la carpeta / bin.
Como se menciona en el diciu, use una ruta absoluta o cárguela como un recurso del cargador de clases.
Supongo que el problema es que estás tratando de usar una ruta relativa para acceder al archivo. Usar la ruta absoluta debería ser de ayuda (es decir, "/home/tomcat5/properties/messages.properties").
Sin embargo, la solución habitual a este problema es utilizar el método getResourceAsStream del ClassLoader. La implementación del archivo de propiedades en "WEB-INF / classes" lo pondrá a disposición del cargador de clases y podrá acceder al flujo de propiedades.
Proto-código no probado:
Properties props = new Properties();
InputStream is =
getClass().getClassLoader().getResourceAsStream("messages.properties");
props.load(is);
Si está intentando acceder a este archivo desde una clase con servicio Servlet, como un ContextListener u otro oyente de ciclo de vida, puede usar el objeto ServletContext para obtener la ruta a un recurso.
Estos tres son aproximadamente equivalentes. (No confunda getResourceAsStream como el proporcionado por la clase ClassLoader
. Se comportan de forma muy diferente)
void myFunc(ServletContext context) {
//returns full path. Ex: C:/tomcat/5.5/webapps/myapp/web-inf/message.properties
String fullCanonicalPath = context.getRealPath("/WEB-INF/message.properties");
//Returns a URL to the file. Ex: file://c:/tomcat..../message.properties
URL urlToFile = context.getResource("/WEB-INF/message.properties");
//Returns an input stream. Like calling getResource().openStream();
InputStream inputStream = context.getResourceAsStream("/WEB-INF/message.properties");
//do something
}
Utilizo el siguiente código para cargar un archivo de propiedades desde un servlet:
public void init(ServletConfig config) throws ServletException {
String pathToFile = config.getServletContext().getRealPath("")
+ "/WEB-INF/config.properties";
Properties properties = new Properties();
properties.load(new FileInputStream(pathToPropertiesFile));
}
Esto funciona con Tomcat 6.0
Lo usé para Jboss Seam:
ServletLifecycle.getServletContext().getRealPath("")