¿Cuál es el mejor lugar para almacenar un archivo de configuración en una aplicación web Java (WAR)?

Creo una aplicación web (WAR) y la despliego en Tomcat. En la aplicación web hay una página con un formulario donde un administrador puede ingresar algunos datos de configuración. No quiero almacenar estos datos en un DBMS, sino solo en un archivo xml en el sistema de archivos. Dónde ponerlo?

Me gustaría poner el archivo en algún lugar del árbol de directorios donde se implementa la aplicación en sí. ¿Debería mi archivo de configuración estar en el directorio WEB-INF ? ¿O ponerlo en otro lado?

¿Y cuál es el código de Java para usar en un servlet para encontrar la ruta absoluta del directorio? ¿O se puede acceder con una ruta relativa?

0
agregado editado
Puntos de vista: 1
Tenga en cuenta que no existe un mecanismo predeterminado para los motores de servlets; deberá realizar suposiciones específicas del proveedor.
agregado el autor Thorbjørn Ravn Andersen, fuente

6 Respuestas

Si es su configuración personalizada, WEB-INF es un buen lugar para ello. Pero algunas bibliotecas pueden requerir que las configuraciones residan en WEB-INF/classes.

0
agregado

Poniéndolo en WEB-INF ocultará el archivo xml de los usuarios que intenten acceder a él directamente a través de una URL, entonces sí, yo diría que lo coloque en WEB-INF .

0
agregado

No lo almacenaría en la carpeta de la aplicación, porque eso anularía la configuración con una nueva implementación de la aplicación.

Sugiero que eche un vistazo a la API de Preferencias o escriba algo en la carpeta de usuarios (el usuario que ejecuta Tomcat).

0
agregado

La respuesta a esto depende de cómo piense leer y escribir ese archivo de configuración.

Por ejemplo, el marco Spring te ofrece la posibilidad de usa archivos de configuración xml (o archivos de propiedades Java); estos se pueden almacenar en su classpath (por ejemplo, en el directorio WEB-INF), en cualquier otro lugar en el sistema de archivos, o incluso en la memoria. Si tuviera que usar Spring para esto, entonces el lugar más fácil para almacenar el archivo de configuración está en su directorio WEB-INF, y luego use Spring's ClassPathXmlApplicationContext clase para acceder a su archivo de configuración.

Pero, de nuevo, todo depende de cómo planeas acceder a ese archivo.

0
agregado

Lo que hacemos es colocarlo en un directorio separado en el servidor (puede usar algo como/config,/opt/config,/root/config,/home/username/config, o cualquier cosa que desee). Cuando nuestros servlets se inician, leen el archivo XML, sacan algunas cosas de él (lo más importante es información de conexión DB), y eso es todo.

Pregunté por qué hicimos esto una vez.

Sería bueno almacenar todo en la base de datos, pero obviamente no se puede almacenar la información de conexión DB en la base de datos.

Podría codificar cosas en el código, pero eso es feo por muchas razones. Si la información tiene que cambiar, debe reconstruir el código y volver a implementarlo. Si alguien obtiene una copia de tu código o tu archivo WAR, ellos obtendrían esa información.

Poner cosas en el archivo WAR parece agradable, pero si quieres cambiar mucho las cosas, podría ser una mala idea. El problema es que si tiene que cambiar la información, la próxima vez que la vuelva a implementar sobrescribirá el archivo para que todo lo que no recuerda cambiar en la versión que se integra en el WAR se olvide.

El archivo en un lugar especial en el sistema de archivos funciona bastante bien para nosotros. No tiene grandes inconvenientes. Ya sabes dónde está, se almacena por separado, hace que la implementación en varias máquinas sea fácil si todos necesitan diferentes valores de configuración (ya que no es parte de la GUERRA).

La única otra solución en la que puedo pensar que funcionaría bien sería mantener todo en el DB excepto la información de inicio de sesión de DB. Eso vendría de las propiedades del sistema Java que se recuperan a través de la JVM. Esto es lo de la API de Preferencias mencionado por Hans Doggen arriba. No creo que haya existido cuando nuestra aplicación se desarrolló por primera vez, si fue que no se usó.

En cuanto a la ruta para acceder al archivo de configuración, es solo un archivo en el sistema de archivos. No necesita preocuparse por la ruta web. Entonces, cuando su servlet se inicia, solo abre el archivo en "/config/myapp/config.xml" (o lo que sea) y encontrará lo correcto. Solo codificar el camino para esto me parece bastante inofensivo.

0
agregado
Especificamos una propiedad del sistema cuando tomcat se inicia. Nuestra aplicación obtiene nuestro directorio de configuración de esta propiedad del sistema, por lo que podemos usar un directorio de configuración diferente de servidor a servidor.
agregado el autor ScArcher2, fuente
¿Cómo funcionaría esto si tienes varios entornos (por ejemplo, prueba y puesta en escena) que se ejecutan en el mismo tomcat? Dado que no puede especificar una propiedad del sistema por entorno cuando solo tiene un tomcat.
agregado el autor AtliB, fuente
Gracias por tus sugerencias Ellos son muy útiles para mí.
agregado el autor boes, fuente
En lugar de hacer referencia a la ruta completa al archivo, puede colocar el directorio "config" en classpath para el servidor y simplemente usar ClassLoader.getResource ().
agregado el autor John Meagher, fuente
Esto también funciona para nosotros, pero puede ocasionar problemas si implementa ocasionalmente en Windows, donde no es natural agregar/aceptar y cosas por el estilo.
agregado el autor Peter Hilton, fuente
solo una pequeña observación: de acuerdo con la guía de jerarquía del sistema de archivos tldp.org /LDP/Linux-Filesystem-Hierarchy/html/opt.html , todos los archivos deben ir en/opt/'paquete'/config donde 'paquete' es el nombre de su programa.
agregado el autor milan, fuente
@ Peter: mi configuración de desarrollo estaba en Windows. Acabo de crear el directorio en mi cuadro de C para que cuando la aplicación solicite "/ config", obtenga el directorio correcto. Funcionó bastante bien
agregado el autor MBCook, fuente
@John: Esa es una muy buena idea, esta fue simplemente la configuración cuando llegué allí.
agregado el autor MBCook, fuente
En la aplicación en la que estoy trabajando estamos almacenando archivos de configuración fuera de la aplicación en una carpeta ubicada en el directorio USER_HOME. Y al inicio, la aplicación obtiene el archivo de la ubicación String absoluteConfigPath = System.getProperty ("user.home") + File.separator + ".myapp" + File.separator + "config.xml";
agregado el autor Nikola, fuente
@MBCook Gracias por tu comentario. Ha aclarado mis dudas.
agregado el autor Vimal Panchal, fuente

WEB-INF es un buen lugar para poner su archivo de configuración. Aquí hay un código para obtener la ruta absoluta del directorio desde un servlet.

public void init(ServletConfig servletConfig) throws ServletException{
    super.init(servletConfig);
    String path = servletConfig.getServletContext().getRealPath("/WEB-INF")
0
agregado
Este no es un enfoque compatible, no está garantizado por la especificación del servlet que getRealPath() devolverá una ruta válida (no nula) o incluso que la guerra se desempaquetará (en mi humilde opinión, Weblogic no extraerá archivos de la .war para disco).
agregado el autor MRalwasser, fuente
¡este NO es un buen enfoque!
agregado el autor Gewure, fuente
Esto no funcionará si tiene un entorno de desarrollo, prueba, pre-prod y prod, ya que necesitaría un .war individual para cada entorno. Debería poder implementar la configuración una vez y luego propagar la misma guerra a través de los entornos ...
agregado el autor Tom Chamberlain, fuente