java - example - ¿Cómo leer el archivo de propiedades en la aplicación web?
spring boot read properties file (3)
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
.
Esta pregunta ya tiene una respuesta aquí:
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?
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:
- Tiene un archivo llamado MAINProperties.properties y dentro de él hay una propiedad: mail.host = foo.example.com
- Crea una clase ficticia llamada MAINProperties sin nada.
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.
Varias notas:
Debería preferir el
ClassLoader
como lo devuelve elThread#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.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.