2008-11-18 11 views
8

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");tomcat 5.5 - problema con la lectura de los archivos de recursos

El problema es que a veces el servlet no puede encontrar el archivo de recursos, pero si recomienzo que un par de veces funciona, a continuación, de nuevo después de algún tiempo se deja de funcionar. ¿Alguien puede 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.

Respuesta

5

Supongo que el problema es que está 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.

No comprobado proto-código:

Properties props = new Properties(); 

InputStream is = 
getClass().getClassLoader().getResourceAsStream("messages.properties"); 

props.load(is); 
2

Si utiliza

new FileReader("message.properties"); 

Entonces el FileReader intentará leer ese archivo desde el directorio base - que a su Tomcat es probable que sea el/bin carpeta.

Como se ha mencionado anteriormente, use una ruta absoluta o cárguela como un recurso del cargador de clases.

9

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 se debe confundir getResourceAsStream como el mismo que el proporcionado por la clase ClassLoader Se comportan de manera 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 
} 
2

utilizo el siguiente código para cargar un archivo de propiedades desde el interior de 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

0

yo utilicé para JBoss Seam:

ServletLifecycle.getServletContext().getRealPath("")

+2

¿Qué tiene esto que ver con la pregunta que se hizo? –

Cuestiones relacionadas