2008-09-18 22 views
54

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?¿Cuál es el mejor lugar para almacenar un archivo de configuración en una aplicación web Java (WAR)?

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?

+2

Tenga en cuenta que no existe un mecanismo predeterminado para los motores de servlets; deberá realizar suposiciones específicas del proveedor. –

Respuesta

47

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.

Le pregunté por qué lo hicimos una vez.

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

Puede 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 quiere 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 quede olvidado.

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 que puedo pensar que funcionaría bien sería mantener todo en la base de datos, excepto la información de inicio de sesión de la base de datos. 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

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. –

+9

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(). –

+5

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. – ScArcher2

5

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).

3

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

Por ejemplo, el marco Spring le da la capacidad de use XML configuration files (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 la clase ClassPathXmlApplicationContext de Spring para acceder a su archivo de configuración.

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

1

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.

16

WEB-INF es un buen lugar para guardar 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") 
+8

Este no es un enfoque compatible: no está garantizado por la especificación del servlet que getRealPath() devuelva una ruta válida (no nula) o incluso que la guerra esté desempaquetada (en mi humilde opinión, Weblogic no extraerá archivos de la .war) en el disco). – MRalwasser

+4

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 desplegar la configuración una vez, y luego propagar la misma guerra a través de los entornos ... –

+0

¡NO es un buen enfoque! – Gewure

9

Ponerlo en WEB-INF se oculta el archivo XML de los usuarios que intentan acceder directamente a través de una URL, así que sí, yo diría que lo puso en WEB-INF.

Cuestiones relacionadas