webentwicklung-frage-antwort-db.com.de

Warum beginnen JVM-Argumente mit "-D"?

Warum müssen wir JVM-Argumenten -D Voranstellen, z. beim Ausführen eines JAR von der Kommandozeile aus? Z.B.

Java -jar -DmyProp="Hello World" myProgram.jar

wird verwendet, um myProgram.jar mit dem Systemparameter myProp auszuführen. Warum also der führende -D? Warum konnten die Architekten von Java einfach machen:

Java -jar -myProp="Hello World" myProgram.jar

Ich hoffe auf eine Antwort jenseits von "Weil es so ist".

Bonusfrage: Warum steht der Buchstabe -D Im Gegensatz zu jedem anderen Buchstaben für etwas?


Hinweis: Bei dieser Frage wurde gefragt, warum ob "D" oder ein anderer Buchstabe verwendet werden musste , an erster Stelle. Es geht weniger um die Wahl eines bestimmten Buchstabens "D" als um einen anderen Buchstaben, obwohl dies als Bonusfrage gestellt wird.

Die Bonusfrage hat hier eine Antwort: In Java -D wofür steht das D? .

46
Colm Bhandal

Warum konnten die Architekten von Java einfach machen:

Java -jar -myProp="Hello World" myProgram.jar

Es könnte heute funktionieren, aber nehmen wir an, dass in den nächsten Java=) - Versionen ein -myProp - Argument als JVM-Option eingeführt wird.
Wie unterscheidet sich Ihr -myProp Von der JVM-Option -myProp? Auf keinen Fall.
Es gibt also einen offensichtlichen Grund, -D Zu verwenden, um define Systemeigenschaften zu definieren.

Angenommen, Ihr Programm verwendet anstelle von -myProp Eine Systemeigenschaft -client.
Es wird nicht ausgeführt:

Java -jar -client="davidxxx" myProgram.jar

Sie hätten einen JVM-Fehler wie:

Nicht erkannte Option: -client = davidxxx

as -client ist eine JVM-Standardoption, die keinen Wert erwartet.

Wenn Sie jedoch -D-client Verwenden, ist dies jetzt in Ordnung, da hier -Dclient Als eine Systemeigenschaft definiert ist, die sich von der Standard-JVM-Option -client Unterscheidet:

Java -jar -D-client="davidxxx" myProgram.jar

Oder indem Sie beide verwenden:

Java -jar -client -D-client="davidxxx" myProgram.jar

m weiter zu gehen, beginnen nicht alle JVM-Argumente mit -D. Die meisten von ihnen haben jedoch ein Präfix (-D, -X, -XX), mit dem irgendwie Namespaces definiert werden können.

Sie haben unterschiedliche Kategorien von JVM-Argumenten:

1. Standardoptionen (-D, Aber nicht nur).

Dies sind die am häufigsten verwendeten Optionen, die von allen Implementierungen der JVM unterstützt werden.

Sie verwenden -D, Um Systemeigenschaften anzugeben, aber die meisten von ihnen haben kein Präfix: -verbose, -showversion Usw. für ...

2. Sonderoptionen (mit dem Präfix -X)

Diese Optionen sind allgemeine Optionen, die für die Java HotSpot Virtual Machine spezifisch sind.
Zum Beispiel: -Xmssize, -Xmxsize

3. Erweiterte Laufzeitoptionen (mit dem Präfix -XX)

Diese Optionen steuern das Laufzeitverhalten der Java HotSpot VM.

4. Erweiterte JIT-Compiler-Optionen (mit dem Präfix -XX)

Diese Optionen steuern die dynamische Just-in-Time-Kompilierung (JIT), die von der Java HotSpot VM) durchgeführt wird.

5. Erweiterte Wartungsoptionen (mit dem Präfix -XX)

Diese Optionen bieten die Möglichkeit, Systeminformationen zu sammeln und umfangreiche Fehlerbehebungen durchzuführen.

6. Erweiterte Speicherbereinigungsoptionen (mit dem Präfix -XX)

Diese Optionen steuern, wie die Garbage Collection (GC) von der Java HotSpot-VM ausgeführt wird.


38
davidxxx

"Definieren". Die Bedeutung ähnelt einer Präprozessordefinition in C. Das -D gibt an, dass sich die Definition im Kontext der Anwendung befindet und nicht im Interpreter-Kontext Java= wie bei jeder anderen Option vor dem Namen der ausführbaren Datei .

Die Verwendung des Buchstabens "D" wird in der Dokumentation nicht speziell erläutert, aber die einzige Verwendung besteht darin, einen Schlüssel in der Systemeigenschaftenzuordnung "zu definieren" - mit Ausnahme dieses Verweises:

Die System-Klasse verwaltet ein Properties-Objekt, das die Konfiguration der aktuellen Arbeitsumgebung definiert. Weitere Informationen zu diesen Eigenschaften finden Sie unter Systemeigenschaften. Im Rest dieses Abschnitts wird erläutert, wie Eigenschaften zum Verwalten der Anwendungskonfiguration verwendet werden.

30
Rakurai

Wenn Sie nichts wie -myProp = "XYZ" angeben, bedeutet dies, dass es als Argument an die Hauptmethode des Programms übergeben wird.

-D bedeutet, dass Sie diesen Wert mit System.getProperty verwenden können

-X wird für Erweiterungsargumente wie -Xdebug -Xnoagent -Djava.compiler = NONE -Xrunjdwp verwendet: transport = dt_socket, server = y, suspend = y, address = 8000

Ja, sie hätten die Charaktere vertauschen können. Diese Zeichen werden jedoch verwendet, um anzugeben, welcher Parametertyp übergeben wird und wer der Verbraucher ist.

6
Deepak

Ohne das -D Die Eigenschaften stehen in Konflikt mit normalen JVM-Optionen. Wie würden Sie beispielsweise die Eigenschaft jar festlegen?

Das -D wurde wahrscheinlich gewählt (darüber kann ich nur spekulieren), weil es auch im C-Präprozessor zur Definition von Symbolen verwendet wird und daher den meisten Leuten vertraut war.

2
Henry