Was ist die beste Praxis für die Einstellung der java-system-properties, -D oder-System.setProperty()?
Ich brauche, um die codebase für das RMI-Anwendung arbeite ich im moment und haben dies erfolgreich unter Verwendung der ersten
try{
ResourceBundle config = ResourceBundle.getBundle("myApp");
String codeBaseUrl = config.getString("codeBaseUrl");
System.setProperty("java.rmi.server.codebase", codeBaseUrl);
} catch (Exception e) {
e.printStackTrace();
}
und später mit
java -Djava.rmi.server.codebase=http://192.168.1.1/path/to/codebase ...
in der Befehlszeile.
Diese beiden Ansätze erlauben, die Codebasis geändert werden, ohne neu kompilieren zu müssen, sondern das System.setProperty Ansatz ermöglicht codebase zu sein, bunlded in einer properties-Datei und aus der gleichen Start-Befehl verwendet werden.
Meisten Lehrbücher/Unterlagen, die ich gelesen habe nutzt dieser die-D-Ansatz führt mich zu glauben, dass dies akzeptiert wird als die beste Praxis, aber ich habe nicht in der Lage, etwas zu finden, das erklärt, WARUM ich das verwenden sollte, über die andere.
Ist -D als best practice gilt für die Einstellung von Systemeigenschaften wie codebase, und welche Vorteile bietet diese geben /welche Fallstricke gilt es zu vermeiden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
(Bearbeitet - I mis-lies die Frage)
Vergleich der beiden:
-D
ist konfigurierbare - es ist zur Laufzeit angegebenSystem.setProperty()
noch "Spielzeit", aber es ist bearbeitet, die über eine Datei, die lebt über die start-up-BefehlErstens, fahren flexibles Verhalten durch angeben von Einstellungen zur Laufzeit ist stets vorzuziehen, um hard-coding zu Verhalten (es sei denn, das Verhalten ist nicht wirklich flexibel, dh nicht verwenden, Konfiguration, es sei denn, es ist Wert dabei).
Den wichtigsten Nachteil einer Datei ist, dass Sie enthalten möglicherweise vertrauliche Daten, wie Passwörter,, die Systemadministratoren wollen nicht dauerhaft herumliegen auf der Festplatte. Wenn das Kennwort eingegeben wird als Teil des start-up-Befehl, es ist vergänglich und viel sicherer (session-Befehl, der Geschichte nicht standhalten).
Der Vorteil der Verwendung einer Datei ist, dass Sie feststellen kann, die richtigen Einstellungen und Sie bleiben in der Datei. Sie können sogar verwalten Sie die Datei mit source-control.
Es gibt eine andere, noch sicherere option, die der haben die start-up-Fragen, für die Kennwörter werden in die Befehlszeile eingegeben, die keine Spuren hinterlässt.
Ich würde System.setProperty (an der Spitze der Anwendung, weil für einige Eigenschaften ist es vielleicht zu spät sonst), aber die Informationen aus einer Konfigurationsdatei.
Du fast machen dass schon, aber ich würde es auch erlauben das beliebige setzen von Eigenschaften, nicht nur ein paar hard-codierte Schlüssel.
Ich mag diese Kombination mit dem Konfigurations-Datei, die die app bereits verwendet, welches sich auch auf anderen (nicht-System.Eigenschaften) - Einstellungen. Ich unterscheide zwischen den beiden, indem Sie die system-Eigenschaften mit a-D (genauso wie in der Kommandozeile):
Gäbe es einen Standard-Speicherort, wo dieses properties-Datei, die aber überschrieben werden können, über ein command-line-Schalter (so dass Sie können Umschalten zwischen verschiedenen Konfigurationen oder mehrere Installationen der code problemlos).
Dass eine Datei hat den zusätzlichen Vorteil, dass es als Dokumentation, auch (wie zu, welche Optionen verfügbar sind, was die Standardwerte sind, und so weiter).
Ich wünschte wirklich, hatte Java ein built-in-Einrichtung to get system properties aus einer properties-Datei, zusammen mit anderen JVM-Einstellungen wie Speicher-und class-path. Derzeit haben Sie, alles zu tun, sich selbst, entweder in Java oder in OS-spezifische shell-Wrapper.
<util:properties id="myFileProperties" location="classpath:myFile.properties"/> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="targetObject" value="#{@systemProperties}" /> <property name="targetMethod" value="putAll" /> <property name="arguments" ref="myFileProperties"/> </bean>
Es sei denn, es gibt einen besonderen Grund, nicht zu (z.B. Vermeidung sensible Informationen, oder das verhindern basteln), ich würde empfehlen mit "-D" - Optionen, anstatt das hinzufügen von Eigenschaften mit dem System.setProperty.
Meine andere Empfehlung wäre NICHT zu benutzen, die System Eigenschaften ein Abladeplatz für eine große Anzahl von anwendungsspezifischen Eigenschaften. Wenn Sie viele Anwendungs-Konfiguration, Eigenschaften-verwenden Sie ein separates Eigenschaften-Objekt (oder etwas komplizierter) und laden Sie es von einem separaten properties-Datei (oder etwas komplizierter). Andere können mit mir nicht einverstanden auf diesem, aber ich habe festgestellt, dass dies ein besserer Ansatz.
(Aber offensichtlich, wenn Sie eine standard-oder 3rd-party-subsystem, das sieht in den Eigenschaften von System, dann ist das, was Sie tun müssen.)
Weil durch die übergabe des Arguments in zur Laufzeit, Sie können problemlos mit einer einzigen quellcodebasis für Entwicklung und Produktion (unter anderen) Umgebungen, ohne zu fest-Anweisungen in den code. Zum Beispiel, in der Entwicklung möchten Sie vielleicht, um eine Verbindung zu einem server auf 192.168.0.1 und in der Produktion möchten Sie vielleicht zu gehen, um 10.0.1.1. Um dieses Ziel zu erreichen durch hardcoding mit System.setProperty man braucht, um bedingte Anweisungen und können sich chaotisch.
Sie in der Regel nicht wollen, kompilieren Sie Ihre app für jede Umgebung, so ist es oft am bequemsten, übergeben Sie das argument zur Laufzeit oder verwenden irgendeine Art von property-Datei, die sich verändern können pro system.
-D<property>=<value>
auf die Laufzeit, die Sie verwenden können, eine property-Datei, um die runtime-Eigenschaften, dann diese Datei laden und verwendenSystem.setProperty(propertyName, propertyValue)
oder ähnliches. Was wäre der Unterschied in diesem Fall?