¿Cómo leer el archivo de propiedades en la aplicación web?

La ubicación del archivo de propiedades es WEB-INF/classes/auth.properties .

No puedo usar formas específicas de JSF (con ExternalContext) porque necesito el archivo de propiedades en un módulo de servicio que no tiene una dependencia en un módulo web.

Ya lo he intentado

 MyService.class.getClassLoader().getResourceAsStream("/WEB-INF/classes/auth.properties"); 

pero devuelve null .

También traté de leerlo con FileInputStream pero requiere la ruta completa de lo que es inaceptable.

¿Algunas ideas?

Varias notas:

  1. Debería preferir el ClassLoader como lo devuelve el Thread#getContextClassLoader() .

     ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 

    Esto devuelve el cargador de clases principal que tiene acceso a todos los recursos. La Class#getClassLoader() solo devolverá el cargador de clase (hijo) de la clase en cuestión, que puede no tener acceso per se al recurso deseado. Siempre funcionará en entornos con un solo cargador de clases, pero no siempre en entornos con una jerarquía compleja de cargadores de clases como webapps.

  2. La carpeta /WEB-INF no está en la raíz del classpath. La carpeta /WEB-INF/classes es. Por lo tanto, debe cargar los archivos de propiedades relativos a eso.

     classLoader.getResourceAsStream("/auth.properties"); 

    Si opta por usar el Thread#getContextClassLoader() , elimine el / .

El ExternalContext#getResourceAsStream() específico de JSF que usa ServletContext#getResourceAsStream() “under the hoods” solo devuelve recursos desde el contenido web (allí donde está /WEB-INF carpeta /WEB-INF ), no desde classpath.

Prueba esto:

 MyService.class.getClassLoader().getResourceAsStream("/auth.properties"); 

La lectura de archivos con getResourceAsStream busca en el classpath para encontrar el recurso a cargar. Dado que el directorio de classes encuentra en la ruta de classes de su aplicación web, debe referirse al archivo como /auth.properties .

ResourceBundle ( http://download.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html ) resuelve la mayoría de los problemas con una ruta relativa / absolut para los archivos de propiedades.

Utiliza la clase Resource y lo dirige a una clase Dummy para hacer referencia a un archivo de propiedades.

Por ejemplo:

  1. Tiene un archivo llamado MAINProperties.properties y dentro de él hay una propiedad: mail.host = foo.example.com
  2. Crea una clase ficticia llamada MAINProperties sin nada.
  3. Usa el siguiente código:

    ResourceBundle.getBundle (“com.example.com.MAINProperties”). GetProperty (“mail.host”)

Y eso es. No se requiere InputStreams.

PD Apache Commons tiene una biblioteca llamada Apache Commons Configuration que tiene muchas capacidades (archivos recargables, múltiples tipos de dominio) que podrían usarse en combinación con las anteriores.