2008-09-18 11 views
54

Ich erstelle eine Webanwendung (WAR) und stelle sie auf Tomcat bereit. In der Webapp gibt es eine Seite mit einem Formular, wo ein Administrator einige Konfigurationsdaten eingeben kann. Ich möchte diese Daten nicht in einem DBMS speichern, sondern nur in einer XML-Datei im Dateisystem. Wo soll es hingestellt werden?Was ist der beste Ort, um eine Konfigurationsdatei in einer Java Web Application (WAR) zu speichern?

Ich möchte die Datei irgendwo in den Verzeichnisbaum, wo die Anwendung selbst bereitgestellt wird. Sollte sich meine Konfigurationsdatei im Verzeichnis WEB-INF befinden? Oder woanders hinlegen?

Und was ist der Java-Code in einem Servlet zu verwenden, um den absoluten Pfad des Verzeichnisses zu finden? Oder kann mit einem relativen Pfad zugegriffen werden?

+2

Beachten Sie, dass es keinen Standardmechanismus für Servlet-Engines gibt - Sie müssen herstellerspezifische Annahmen treffen. –

Antwort

47

Was wir tun ist es in ein separates Verzeichnis auf dem Server zu legen (Sie könnten etwas wie/config,/opt/config,/root/config,/home/username/config, oder was auch immer Sie wollen). Wenn unsere Servlets starten, lesen sie die XML-Datei, holen ein paar Dinge heraus (vor allem DB-Verbindungsinformationen), und das war's.

Ich fragte nach, warum wir das einmal gemacht haben.

Es wäre nett, alles in der DB zu speichern, aber offensichtlich können Sie DB-Verbindungsinformationen in der DB nicht speichern.

Sie könnten Dinge im Code fest codieren, aber das ist aus vielen Gründen hässlich. Wenn sich die Informationen jemals ändern müssen, müssen Sie den Code neu erstellen und erneut bereitstellen. Wenn jemand eine Kopie Ihres Codes oder Ihrer WAR-Datei erhält, erhält er diese Informationen.

Die Dinge in die WAR-Datei scheinen nett, aber wenn Sie die Dinge viel ändern möchten, könnte es eine schlechte Idee sein. Das Problem ist, dass, wenn Sie die Informationen ändern müssen, das nächste Mal, wenn Sie es erneut überschreiben, die Datei überschreiben wird, sodass alles vergessen wird, was Sie nicht daran erinnerten, es in der Version zu ändern.

Die Datei an einem speziellen Ort auf der Dateisystem-Sache funktioniert ganz gut für uns. Es hat keine großen Nachteile. Sie wissen, wo es ist, es ist separat gespeichert, macht die Bereitstellung auf mehreren Maschinen einfach, wenn sie alle unterschiedliche Konfigurationswerte benötigen (da sie nicht Teil der WAR sind).

Die einzige andere Lösung, die ich mir vorstellen könnte, würde gut funktionieren, würde alles in der DB außer den DB-Login-Informationen zu halten. Dies würde von Java-Systemeigenschaften stammen, die über die JVM abgerufen werden. Dies ist die Preferences-API-Sache, die oben von Hans Doggen erwähnt wurde. Ich glaube nicht, dass es war, als unsere Anwendung zum ersten Mal entwickelt wurde, wenn es nicht verwendet wurde.

Wie für den Pfad für den Zugriff auf die Konfigurationsdatei ist es nur eine Datei im Dateisystem. Sie müssen sich nicht um den Webpfad kümmern. Wenn Ihr Servlet startet, öffnet es einfach die Datei unter "/config/myapp/config.xml" (oder was auch immer) und es wird das Richtige finden. Den Pfad für diesen hier zu programmieren, scheint mir ziemlich harmlos zu sein.

+0

Dies funktioniert auch für uns, aber es kann ein Schmerz sein, wenn Sie gelegentlich unter Windows bereitstellen, wo es nicht natürlich ist, hinzuzufügen/opt und dergleichen. –

+9

Anstatt den vollständigen Pfad zu der Datei zu referenzieren, können Sie das Verzeichnis "config" in den Klassenpfad für den Server stellen und einfach ClassLoader.getResource() verwenden. –

+5

Wir geben eine Systemeigenschaft an, wenn Tomcat gestartet wird. Unsere App ruft unser Konfigurationsverzeichnis von dieser Systemeigenschaft ab, sodass wir ein anderes Konfigurationsverzeichnis von Server zu Server verwenden können. – ScArcher2

5

Ich würde es nicht im Anwendungsordner speichern, da dies die Konfiguration mit einer neuen Bereitstellung der Anwendung überschreiben würde.

Ich schlage vor, Sie sehen sich die Einstellungen-API an, oder schreiben Sie etwas in den Benutzerordner (der Benutzer, der Tomcat ausführt).

3

Die Antwort darauf hängt davon ab, wie Sie diese Konfigurationsdatei lesen und schreiben möchten.

Zum Beispiel bietet das Spring-Framework die Möglichkeit use XML configuration files (oder Java-Eigenschaftendateien); Diese können in Ihrem Klassenpfad (z. B. im WEB-INF-Verzeichnis), an einer anderen Stelle im Dateisystem oder sogar im Speicher gespeichert werden. Wenn Sie Spring hierfür verwenden, ist der einfachste Ort zum Speichern der Konfigurationsdatei in Ihrem WEB-INF-Verzeichnis und dann Spring's ClassPathXmlApplicationContext-Klasse für den Zugriff auf Ihre Konfigurationsdatei.

Aber wieder hängt alles davon ab, wie Sie auf diese Datei zugreifen möchten.

1

Wenn es Ihre benutzerdefinierte Konfiguration WEB-INF ist, ist ein guter Platz dafür. Einige Bibliotheken benötigen jedoch möglicherweise Configs in WEB-INF/classes.

16

WEB-INF ist ein guter Ort, um Ihre Konfigurationsdatei zu setzen. Hier ist ein Code, um den absoluten Pfad des Verzeichnisses von einem Servlet zu erhalten.

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

Dies ist kein kompatibler Ansatz - es wird nicht durch die Servlet-Spezifikation garantiert, dass getRealPath() einen gültigen (nicht null) Pfad zurückgibt oder sogar, dass der Krieg überhaupt entpackt wird (IMHO wird Weblogic keine Dateien aus dem .war extrahieren) auf die Festplatte). – MRalwasser

+4

Dies funktioniert nicht, wenn Sie eine Umgebung für Entwicklung, Test, Pre-Prod und Prod haben, da Sie für jede Umgebung ein eigenes WAR benötigen. Sie sollten in der Lage sein, die Konfiguration einmal bereitzustellen und dann den gleichen Krieg durch die Umgebungen zu verbreiten ... –

+0

das ist überhaupt kein guter Ansatz! – Gewure

9

es in WEB-INF Putting wird die XML-Datei von den Benutzern verstecken, die versuchen, es über eine URL direkt zuzugreifen, also ja, würde ich es sagen, in WEB-INF setzen.

Verwandte Themen