Warum müssen wir JVM-Argumenten ein Präfix voranstellen, -D
z. B. wenn ein JAR über die Befehlszeile ausgeführt wird? Z.B
java -jar -DmyProp="Hello World" myProgram.jar
wird verwendet, um myProgram.jar
mit dem Systemparameter zu laufen myProp
. Warum also die Führung -D
? Warum konnten die Architekten von Java uns nicht einfach Folgendes tun lassen:
java -jar -myProp="Hello World" myProgram.jar
Ich hoffe auf eine Antwort, die über "Weil es so ist" hinausgeht.
Bonusfrage: Warum steht der Brief -D
im Gegensatz zu jedem anderen Brief für irgendetwas?
Hinweis: In dieser Frage wird gefragt, warum überhaupt "D" oder ein anderer Buchstabe verwendet werden musste. 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? .
quelle
Antworten:
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 können Sie Ihre
-myProp
von der-myProp
JVM-Option unterscheiden? Auf keinen Fall.Es gibt also einen offensichtlichen Grund , Systemeigenschaften
-D
zu definieren .Anstatt
-myProp
anzunehmen , dass sich Ihr Programm auf eine-client
Systemeigenschaft stützt .Es wird nicht ausgeführt:
java -jar -client="davidxxx" myProgram.jar
Sie hätten einen JVM-Fehler wie:
wie
-client
eine JVM Standardoption , die keinen Wert erwartet.Wenn Sie jedoch verwenden
-D-client
, ist dies jetzt in Ordnung, da hier-Dclient
eine Systemeigenschaft definiert ist, die sich von der-client
Standard-JVM-Option unterscheidet:java -jar -D-client="davidxxx" myProgram.jar
Oder indem Sie beide verwenden:
java -jar -client -D-client="davidxxx" myProgram.jar
Um weiter zu gehen, beginnen nicht alle JVM-Argumente mit
-D
. aber die meisten von ihnen haben einen Präfix (-D
,-X
,-XX
) , die in einem someway ermöglicht Namensräume zu definieren.Sie haben verschiedene 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 festlegen , aber die meisten von ihnen haben keinen Präfix:-verbose
,-showversion
, und so für ...2. Nicht standardmäßige Optionen (mit dem Präfix
-X
)Diese Optionen sind Allzweckoptionen, 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 ein umfangreiches Debugging durchzuführen.
6. Erweiterte Garbage Collection-Optionen (mit dem Präfix
-XX
)Diese Optionen steuern, wie die Garbage Collection (GC) von der Java HotSpot-VM ausgeführt wird.
quelle
"Definieren". Die Bedeutung ähnelt einer Präprozessordefinition in C. Das -D bedeutet, dass sich die Definition im Kontext der Anwendung befindet und nicht im Java-Interpreter-Kontext wie jede andere Option vor dem Namen der ausführbaren Datei.
Die Verwendung des Buchstabens "D" wird in der Dokumentation nicht speziell erläutert. Die einzige Verwendung besteht darin, einen Schlüssel in der Zuordnung der Systemeigenschaften zu "definieren" - mit Ausnahme dieser Referenz:
quelle
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 austauschen können. Diese Zeichen werden jedoch verwendet, um anzugeben, welcher Parametertyp übergeben wird und wer der Verbraucher ist.
quelle
Ohne die würden
-D
die Eigenschaften mit normalen JVM-Optionen in Konflikt stehen. Wie würden Sie beispielsweise die Eigenschaft festlegenjar
?Das
-D
wurde wahrscheinlich gewählt (darüber kann ich nur spekulieren), weil es auch im C-Präprozessor zum Definieren von Symbolen verwendet wird und daher den meisten Menschen vertraut war.quelle