Frage

Zum Beispiel:

MeineAnw ist eine Web-Anwendung, die eine Eigenschaftendatei (server.properties) enthält, die Konfigurationsdaten beschreibt (zum Beispiel Servernamen) für die App. In der Entwicklungsphase wird server.properties in seinem eigenen IDE Projektordner (einen logischen Ort für sie) befindet.

Jetzt ist es Zeit MeineAnw einzusetzen. Die IDE macht es ziemlich trivial die Klassendateien sowie die unterstützenden Konfigurationsdateien jar auf. Jetzt ziehen wir nur die Jar in dem entsprechenden Web-Container und wir gehen weg ....

Eine Woche später ... die Server-Konfigurationsdaten, die MeineAnw Bedürfnisse ändern verwendet. Das macht mehr Sinn?

A. Ändern Sie die server.properties in IDE Land-Datei wieder und erzeugen eine völlig neue JAR-Datei. Umschichten. (Was bedeutet, die App für eine einfache Konfigurationsänderung Prellen).

B. Knacken den bereits im Einsatz Jar und ändert die server.properties-Datei? (Kann eine Refresh-Funktion in MyApp nennen, wenn server.properties zwischengespeichert wird ... sollte aber nicht eine vollständige App Bounce erfordern. Denken Sie auch daran müssen Quelle server.properties zu modifizieren und so Zukunft entfaltet server.properties nicht zurückkehren zu den alten Servernamen).

C. Machen server.properties außerhalb der JAR-Datei in dem ersten Platz. Sehr ähnlichen Prozess B, mit dem kleinen Unterschied von Konfigurationsdaten außerhalb des jar hält (stellt verschiedene Wege zwischen Entwicklung und Produktion entfaltet)

D. Sonstiges:

Danke!

War es hilfreich?

Lösung

ich mit D gehen würde.

Versuchen Sie, die Eigenschaften von Dateien von außerhalb des .jar dann zu laden, wenn das fehlschlägt, die Eigenschaften in das Glas eingebaut laden.

Auf diese Weise können Sie mit jedem Build eine „ready made“ Konfiguration Push-out (reduziert auch die Komplexität einer Implementierung, wenn sie von nur einer Datei), während auch übergeordnete Konfigurationen möglich und relativ einfach zu machen.

Andere Tipps

Wenn Sie mit Spring dann können Sie nutzen die Eigenschaft Platzhalter, um die Arbeit zu tun.

<!-- try and resolve the config from the filesystem first and then fallback to the classpath -->
<context:property-placeholder location="file:config.properties, classpath:config.properties"
                              ignore-resource-not-found="true"/>

Sie können eine Ressource angeben, auf dem Dateisystem und auch auf dem Classpath, Frühling wird zuerst versuchen, und alle Eigenschaften aus dem Dateisystem zu lösen und dann zu dem Classpath Rückfall. Durch die Angabe des „ignore-Ressource-not-found“ Attributs als „true“ wird es Frühling von Auslösen eine Ausnahme verhindern, wenn die Datei auf dem Dateisystem nicht vorhanden ist, und erlaubt es, die Eigenschaften von dem Classpath statt zu lösen.

diese Kombination können Sie auch die Eigenschaften über zwei Dateien aufgeteilt, zum Beispiel nie Passwörter in der Datei auf dem Classpath angeben möchtest und erwarten, dass sie auf dem Dateisystem extern vorgegeben werden. Alle Eigenschaften aus dem Dateisystem nicht entsprechen, werden aus dem Classpath aufgelöst werden.

In einem Ordner mit:

application.jar
config.properties

Es soll möglich sein, zu verwenden:

java -jar application.jar

Dies ist ein Beispiel config.properties Referenz:

# This file contains properties that are used to configure the application
database.url=127.0.0.1
database.port=3306
database.user=root
database.pass=p4ssw0rd

Es hängt davon ab. Wenn die Eigenschaftsdatei Daten enthält, die durch den Benutzer Ihrer Anwendung oder Bibliothek geändert werden sollen, als es sollte außerhalb wohnen.

Wenn es Daten enthält, die statisch ist und Sie erstellt die Eigenschaften Dateien nur zu vermeiden, die Codierung der Werte in den Sourcecode oder wenn die Dateien Strings lokalisiert sind, würde ich sie in das Glas verlassen. Zumindest, weil eine Eigenschaftsdatei Menschen ändern Werte lädt;)

D.

Legen Sie die Eigenschaften in das Glas. Dann erstellen Sie eine neue Eigenschaften, um die Glas-ed Eigenschaften wie die Standardeinstellungen verwenden. Dann laden Sie von außerhalb des Glases. Auf diese Weise kann wählen Anpassung von Eigenschaften.

Denken Sie daran, dass in J2EE, Sie sind nicht Dateien in der Lage sein, garantieren den Zugriff von außerhalb der J2EE-Umgebung (keinen direkten Dateizugriff).

Sie müßten JNDI verwenden, um eine Datenquelle enthalten, um Ihre Daten zu verweisen, oder eine Eigenschaftendatei in Ihrer Bereitstellung Artefakte.

Websphere, zum Beispiel, erlaubt keine direkten Dateizugriff standardmäßig aktiviert.

Option D. In verschiedenen Umgebungen Sie müssen möglicherweise umweltrelevanten Eigenschaften wie die Verbindung mit der Datenbank oder Proxy usw. angeben angeben möchten.

Andere Sache erwähnenswert ist, dass Sie möchten, um schnell eine Eigenschaft ändern, ohne ein Glas in der Produktion vorzuverpacken mit oder ersetzen Sie die Eigenschaften in der JAR-Datei.

z. Der Datenbankserver ist umgefallen, und Sie müssen auf einen anderen Server-zu-Punkt (wenn nicht sogar einen Load Balancer der Datenbanken verwenden). Also alles, was Sie tun müssen, ist die Datenbankeigenschaften und Neustart zu ersetzen. Sie sparen viel Zeit dort.

Häufig ist es ein Kriterium, das Code migriert werden sollte UNVERäNDERT von Test bis zur Produktion. Dies bedeutet, dass Sie keine eingebetteten Konfigurationsdateien bearbeiten kann. Auch Sie können in einer Situation kommen, wo Sie eine entfaltete Konfiguration ändern müssen - was häufig sehr umständlich ist. Daher verlassen wir die configuraiton außerhalb der Gläser.

Für Java-EE-Anwendungen betrachten JNDI oder eine Eigenschaft Datei im Classpath.

Ich habe eine Web-Anwendung, in der die Konfiguration von einem Nachbarn Webapplikation retreived wird einfach die beiden zu trennen. Das erwies sich viel einfacher zu sein.

Ich verwende Eigenschaftsdateien in Webapps (WARs), aber vor allem für Standardwerte und Sachen, die mehr oder weniger unveränderlich sind (da Webapps nicht ihre WARs updaten sollte, selbst wenn sie können).

Für Sachen wie das, was du redest, aber verwende ich JNDI. Sie können die Eigenschaften als Ressourcen in der web.xml-Datei definieren. Auf diese Weise, im schlimmsten Fall, aktualisieren Sie web.xml und nicht die App selbst.

Bei einigen Servern gibt es Möglichkeiten, zu überschreiben diese Ressourcenwerte, ohne den Krieg überhaupt zu berühren. Zum Beispiel in Tomcat.

ich normalerweise ein WAR für den Test machen, Q / A und die Produktion und überschreiben die Umwelt empfindlichen Ressourcen in genau das war, mit Tomcat-Kontext XML-Dateien. Ich halte dies für viel besser, als wenn mehrere WARs zu bauen oder WARS zu ändern, da die App Ich bin Tests für die App ist fast identisch, die in der Produktion ist.

Ich denke, die Antwort hängt davon ab, ob Sie denken, dass Sie für die configs zur Versionskontrolle benötigen. (Sie können Produktion configs oder configs für Regressionstests sein ...)

  • Wenn Sie die Versionskontrolle nicht benötigen, dann Option D mit einer externen Eigenschaftsdatei, die eine Eigenschaft Datei überschreibt gut ist. Optionen B und C sind offener für Sachen-ups, aber wenn Sie wirklich gepflegt würden Sie Versionskontrolle werden: -)
  • Wenn Sie die Versionskontrolle benötigen, Option A gibt Ihnen mehr Kontrolle, aber wenn Sie die Möglichkeit, mehrere Einsätze haben Sie auch / müssen auf die Version, die configs für jeden Einsatz steuern möchten. Ein Beispiel dafür ist getrennte Implementierungen zu testen und Produktionsplattformen.

Hier ist, wie wir dies tun, mit Maven-Modulen und Maven IST "Overlays" Datei.

  1. Wir haben mehrere Module für die Java-Code-Komponenten. Dies sind JAR-Module.
  2. Wir haben „Basis Webapp“ Modul für die statischen Inhalte, JSPs und Kernkonfigurationsdaten (Feder Verkabelung, Standardeigenschaften). Dies ist ein Krieg-Modul, so dass das Ergebnis des Gebäudes ist ein Krieg, der die oben + alle JAR-Dateien enthält.
  3. Jede einzelne „Site-Konfiguration“ ist ein WAR-Modul, das ortsspezifische Überschreibungen für Eigenschaften, Verdrahtung Dateien und Inhalte enthält. Die übergeordnete beschrieben ist die Maven IST „overlay“ Mechanismus verwendet wird, und führt zu einem neuen Krieg wird von der „Basis“ Krieg und den Überschreibungen montiert.

All dies wird in der Versionskontrolle überprüft, und Sie benötigen eine Maven bauen und IST-Bereitstellung zu tun, um Konfigurationsänderungen vorzunehmen.

Ich habe eine ähnliche Frage gestellt. Wir haben nicht alles aus noch dachte. Aber wir suchen in URL-Ressourcen. Wo die Eigenschaft-Datei direkt aus dem SVN lesen. Keine Notwendigkeit, etwas anderes als die Eigenschaftsdatei aktualisieren.

Ich entwickle J2EE-Anwendungen mit Spring. Ich lief um das gleiche Problem eine recht lange Zeit und dann eine Lösung gefunden.  Mein Problem war, die Datenbankeigenschaften in einem Eigenschaft außerhalb der WAR-Datei-Datei angeben, die ich bereitstellen. Die Lösung, die ich auf diese gefunden ist, die PropertyPlaceholderConfigurer zu verwenden und die Lage Eigenschaft geben Sie Ihren Systemstandort, da dies zu lokalisieren,

    

Das war ganz einfach und es funktionierte gut!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top