Es tu elección. Básicamente, existen tres formas en un archivo de aplicación web Java (WAR):
1. Ponlo en classpath
Para que pueda cargarlo ClassLoader#getResourceAsStream()
con una ruta relativa classpath:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("foo.properties");
// ...
Properties properties = new Properties();
properties.load(input);
Aquí foo.properties
se supone que debe colocarse en una de las raíces que están cubiertas por el classpath predeterminado de una aplicación web, por ejemplo, aplicaciones web /WEB-INF/lib
y /WEB-INF/classes
servidores /lib
, o JDK / JRE /lib
. Si el archivo de propiedades es específico de una aplicación web, lo mejor es colocarlo /WEB-INF/classes
. Si está desarrollando un proyecto WAR estándar en un IDE, colóquelo en la src
carpeta (la carpeta de origen del proyecto). Si está utilizando un proyecto Maven, colóquelo en la /main/resources
carpeta.
Alternativamente, también puede colocarlo en algún lugar fuera del classpath predeterminado y agregar su ruta al classpath del servidor de aplicaciones. En, por ejemplo, Tomcat puede configurarlo como shared.loader
propiedad de Tomcat/conf/catalina.properties
.
Si lo ha colocado foo.properties
en una estructura de paquete Java como com.example
, entonces necesita cargarlo como se muestra a continuación
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("com/example/foo.properties");
// ...
Tenga en cuenta que esta ruta de un cargador de clases de contexto no debe comenzar con a /
. Solo cuando está utilizando un cargador de clases "relativo" como SomeClass.class.getClassLoader()
, entonces realmente necesita comenzar con un /
.
ClassLoader classLoader = getClass().getClassLoader();
InputStream input = classLoader.getResourceAsStream("/com/example/foo.properties");
// ...
Sin embargo, la visibilidad del archivo de propiedades depende del cargador de clases en cuestión. Solo es visible para el mismo cargador de clases que el que cargó la clase. Entonces, si la clase es cargada por, por ejemplo, el cargador de clases común del servidor en lugar del cargador de clases webapp, y el archivo de propiedades está dentro de la propia aplicación web, entonces es invisible. El cargador de clases de contexto es su apuesta más segura, por lo que puede colocar el archivo de propiedades "en todas partes" en el classpath y / o tiene la intención de poder anular uno proporcionado por el servidor desde la aplicación web.
2. Póngalo en contenido web
Para que pueda cargarlo ServletContext#getResourceAsStream()
con una ruta relativa al contenido web:
InputStream input = getServletContext().getResourceAsStream("/WEB-INF/foo.properties");
// ...
Tenga en cuenta que he demostrado colocar el archivo en la /WEB-INF
carpeta, de lo contrario, cualquier navegador web hubiera podido acceder a él. También tenga en cuenta que el ServletContext
está en cualquier HttpServlet
clase solo accesible por el heredado GenericServlet#getServletContext()
y Filter
por FilterConfig#getServletContext()
. En caso de que no esté en una clase de servlet, generalmente solo es inyectable @Inject
.
3. Póngalo en el sistema de archivos del disco local
Para que pueda cargarlo de la java.io
manera habitual con una ruta absoluta del sistema de archivos del disco local:
InputStream input = new FileInputStream("/absolute/path/to/foo.properties");
// ...
Tenga en cuenta la importancia de utilizar una ruta absoluta. Las rutas relativas del sistema de archivos de disco local son absolutamente imposibles en una aplicación web Java EE. Vea también el primer enlace "Ver también" a continuación.
¿Cuál elegir?
Solo sopese las ventajas / desventajas en su propia opinión de mantenibilidad.
Si los archivos de propiedades son "estáticos" y nunca necesitan cambiar durante el tiempo de ejecución, puede mantenerlos en WAR.
Si prefiere poder editar archivos de propiedades desde fuera de la aplicación web sin la necesidad de reconstruir y volver a implementar el WAR cada vez, póngalo en el classpath fuera del proyecto (si es necesario, agregue el directorio al classpath).
Si prefiere poder editar archivos de propiedades mediante programación desde el interior de la aplicación web mediante el Properties#store()
método, colóquelo fuera de la aplicación web. Como Properties#store()
requiere a Writer
, no puede usar una ruta de sistema de archivos de disco. Esa ruta a su vez se puede pasar a la aplicación web como argumento de VM o propiedad del sistema. Como precaución, nunca lo usegetRealPath()
. Todos los cambios en la carpeta de implementación se perderán en una nueva implementación por la sencilla razón de que los cambios no se reflejan en el archivo WAR original.
Ver también: