Qual è il posto migliore per archiviare un file di configurazione in un'applicazione Web Java (WAR)?

StackOverflow https://stackoverflow.com/questions/96247

Domanda

Creo un'applicazione web (WAR) e la distribuisco su Tomcat.Nel webapp è presente una pagina con un form in cui un amministratore può inserire alcuni dati di configurazione.Non voglio archiviare questi dati in un DBMS, ma solo in un file XML sul file system.Dove metterlo?

Vorrei inserire il file da qualche parte nell'albero delle directory in cui è distribuita l'applicazione stessa.Il mio file di configurazione dovrebbe essere nel formato WEB-INF rubrica?O metterlo da qualche altra parte?

E qual è il codice Java da utilizzare in una servlet per trovare il percorso assoluto della directory?Oppure è possibile accedervi con un percorso relativo?

È stato utile?

Soluzione

Quello che facciamo è metterlo in una directory separata sul server (potresti usare qualcosa come /config, /opt/config, /root/config, /home/username/config o qualsiasi cosa tu voglia).Quando i nostri servlet si avviano, leggono il file XML, ne ricavano alcune cose (soprattutto le informazioni sulla connessione DB) e il gioco è fatto.

Ho chiesto perché l'abbiamo fatto una volta.

Sarebbe bello memorizzare tutto nel DB, ma ovviamente non è possibile memorizzare le informazioni sulla connessione al DB nel DB.

Potresti codificare le cose nel codice, ma è brutto per molte ragioni.Se le informazioni devono cambiare, è necessario ricostruire il codice e ridistribuirlo.Se qualcuno ottiene una copia del tuo codice o del tuo file WAR, otterrà tali informazioni.

Mettere le cose nel file WAR sembra carino, ma se vuoi cambiare molto le cose potrebbe essere una cattiva idea.Il problema è che se devi modificare le informazioni, la prossima volta che le ridistribuirai sovrascriverà il file, quindi tutto ciò che non ti sei ricordato di modificare nella versione incorporata in WAR verrà dimenticato.

Il file in un posto speciale nel file system funziona abbastanza bene per noi.Non ha grandi svantaggi.Sai dove si trova, è archiviato separatamente, semplifica la distribuzione su più macchine se tutte necessitano di valori di configurazione diversi (poiché non fa parte del WAR).

L'unica altra soluzione che mi viene in mente che funzionerebbe bene sarebbe mantenere tutto nel DB tranne le informazioni di accesso al DB.Ciò deriverebbe dalle proprietà del sistema Java recuperate tramite JVM.Questa è la cosa dell'API Preferenze menzionata da Hans Doggen sopra.Non penso che esistesse quando la nostra applicazione è stata sviluppata per la prima volta, se lo era non è stata utilizzata.

Per quanto riguarda il percorso per accedere al file di configurazione, è semplicemente un file sul filesystem.Non devi preoccuparti del percorso web.Quindi, quando il tuo servlet si avvia, apre semplicemente il file in "/config/myapp/config.xml" (o qualsiasi altra cosa) e troverà la cosa giusta.Il solo fatto di codificare il percorso per questo mi sembra abbastanza innocuo.

Altri suggerimenti

WEB-INF è un buon posto dove inserire il file di configurazione.Ecco del codice per ottenere il percorso assoluto della directory da un servlet.

public void init(ServletConfig servletConfig) throws ServletException{
    super.init(servletConfig);
    String path = servletConfig.getServletContext().getRealPath("/WEB-INF")

Mettendolo dentro WEB-INF nasconderà il file XML agli utenti che tentano di accedervi direttamente tramite un URL, quindi sì, direi di inserirlo WEB-INF.

Non lo memorizzerei nella cartella dell'applicazione, perché ciò sovrascriverebbe la configurazione con una nuova distribuzione dell'applicazione.

Ti suggerisco di dare un'occhiata all'API Preferenze o di scrivere qualcosa nella cartella degli utenti (l'utente che esegue Tomcat).

La risposta a questa domanda dipende da come intendi leggere e scrivere quel file di configurazione.

Ad esempio, il framework Spring ti dà la possibilità di farlo utilizzare file di configurazione XML (o file di proprietà Java);questi possono essere archiviati nel classpath (ad esempio, nella directory WEB-INF), in qualsiasi altro punto del filesystem o anche in memoria.Se dovessi utilizzare Spring per questo, il posto più semplice in cui archiviare il file di configurazione è nella directory WEB-INF, quindi utilizzare Spring ClassPathXmlApplicationContext class per accedere al file di configurazione.

Ma ancora una volta, tutto dipende da come prevedi di accedere a quel file.

Se è la tua configurazione personalizzata, WEB-INF è un buon posto per farlo.Ma alcune librerie potrebbero richiedere che le configurazioni risiedano in WEB-INF/classes.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top