Was ist der beste Ort, um eine Konfigurationsdatei in einer Java-Webanwendung (WAR) zu speichern?

Ich erstelle eine Web-Anwendung (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?

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

Und welcher Java-Code wird in einem Servlet verwendet, um den absoluten Pfad des Verzeichnisses zu finden? Oder kann mit einem relativen Pfad zugegriffen werden?

0
Beachten Sie, dass es keinen Standardmechanismus für Servlet-Engines gibt - Sie müssen herstellerspezifische Annahmen treffen.
hinzugefügt der Autor Thorbjørn Ravn Andersen, Quelle

6 Antworten

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

0
hinzugefügt

Wenn Sie es in WEB-INF einfügen, wird die XML-Datei vor Benutzern verborgen, die versuchen, direkt über eine URL darauf zuzugreifen, also ja, ich würde sagen in WEB-INF .

0
hinzugefügt

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

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

0
hinzugefügt

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

Zum Beispiel gibt Ihnen das Spring-Framework die Möglichkeit, XML-Konfigurationsdateien verwenden (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 dafür verwenden, ist der einfachste Ort, um die Konfigurationsdatei zu speichern, in Ihrem WEB-INF-Verzeichnis und verwenden Sie dann Spring KlassePathXmlApplicationContext Klasse für den Zugriff auf Ihre Konfigurationsdatei.

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

0
hinzugefügt

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 alles was Sie wollen verwenden). 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 schön, alles in der DB zu speichern, aber offensichtlich können Sie keine DB-Verbindungsinformationen in der Datenbank 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.

Dinge in die WAR-Datei zu bringen, scheint nett zu sein, aber wenn du die Dinge viel ändern willst, 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 kann, wäre gut, würde alles in der DB außer den DB-Login-Informationen 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 keine Gedanken über den Webpfad machen. 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
hinzugefügt
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.
hinzugefügt der Autor ScArcher2, Quelle
Wie würde das funktionieren, wenn mehrere Umgebungen (z. B. Test und Staging) im selben Tomcat ausgeführt werden? Da Sie keine Systemeigenschaft pro Umgebung angeben können, wenn Sie nur einen Tomcat haben.
hinzugefügt der Autor AtliB, Quelle
Danke für deine Vorschläge. Sie sind sehr nützlich für mich.
hinzugefügt der Autor boes, Quelle
Anstatt auf den vollständigen Pfad zur Datei zu verweisen, können Sie das Verzeichnis "config" in den Klassenpfad für den Server einfügen und einfach ClassLoader.getResource() verwenden.
hinzugefügt der Autor John Meagher, Quelle
Dies funktioniert auch für uns, aber es kann ein Schmerz sein, wenn Sie gelegentlich auf Windows bereitstellen, wo es nicht natürlich ist, hinzuzufügen/opt und dergleichen.
hinzugefügt der Autor Peter Hilton, Quelle
nur eine kleine Bemerkung: nach dem Dateisystem Hierarchieführer tldp.org /LDP/Linux-Filesystem-Hierarchy/html/opt.html , alle Dateien sollten unter/opt/'package'/config stehen, wobei 'Paket' der Name Ihres Programms ist.
hinzugefügt der Autor milan, Quelle
@Peter: Mein Dev-Setup war unter Windows. Ich habe gerade das Verzeichnis auf meiner Box von C erstellt, so dass, wenn die Anwendung nach "/ config" fragt, es das richtige Verzeichnis bekommen würde. Es hat ganz gut funktioniert.
hinzugefügt der Autor MBCook, Quelle
@John: Das ist eigentlich eine ziemlich gute Idee, das war einfach das Setup, als ich dort ankam.
hinzugefügt der Autor MBCook, Quelle
In der Anwendung, an der ich gerade arbeite, speichern wir die Konfigurationsdatei außerhalb der Anwendung in einem Ordner im Verzeichnis USER_HOME. Und beim Start erhält die Anwendung die Datei vom Speicherort String absoluteConfigPath = System.getProperty ("user.home") + File.separator + ".myapp" + File.separator + "config.xml";
hinzugefügt der Autor Nikola, Quelle
@MBCook Vielen Dank für Ihren Kommentar. Es hat meine Zweifel ausgeräumt.
hinzugefügt der Autor Vimal Panchal, Quelle

WEB-INF ist ein guter Ort, um Ihre Konfigurationsdatei zu speichern. 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")
0
hinzugefügt
Dies ist kein kompatibler Ansatz - es wird durch die Servlet-Spezifikation nicht garantiert, dass getRealPath() einen gültigen Pfad (nicht null) zurückgibt oder sogar, dass der Krieg überhaupt entpackt wird (IMHO wird Weblogic keine Dateien aus dem .war to extrahieren) Scheibe).
hinzugefügt der Autor MRalwasser, Quelle
Das ist überhaupt kein guter Ansatz!
hinzugefügt der Autor Gewure, Quelle
Dies funktioniert nicht, wenn Sie eine Umgebung für Entwicklung, Test, Pre-Prod und Prod haben, da Sie für jede Umgebung ein individuelles WAR benötigen. Sie sollten in der Lage sein, die Konfiguration einmal bereitzustellen und dann den gleichen Krieg durch die Umgebungen zu verbreiten ...
hinzugefügt der Autor Tom Chamberlain, Quelle
JavaScript - Deutsche Gemeinschaft
JavaScript - Deutsche Gemeinschaft
3 der Teilnehmer

In dieser Gruppe sprechen wir über JavaScript.