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? .
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.
"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.
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.
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.