Warum beginnen JVM-Argumente mit "-D"?

78

Warum müssen wir JVM-Argumenten ein Präfix voranstellen, -Dz. B. wenn ein JAR über die Befehlszeile ausgeführt wird? Z.B

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

wird verwendet, um myProgram.jarmit 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 -Dim 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? .

Colm Bhandal
quelle
Dies ist eine gute Frage für Oracle / Sun-Entwickler. Übrigens, warum ist das ein Problem für Sie?
BackSlash
9
@BackSlash Ich mag es zu verstehen, dass sie "warum" über das bloße "Dinge zum Laufen bringen" hinausgehen.
Colm Bhandal
Alle guten Antworten; Leider kann ich nur einen akzeptieren. Vielen Dank für die Erleuchtung!
Colm Bhandal
3
Mögliches Duplikat von In Java -D Wofür steht das D?
Autar
1
@Autar Das ist kein Duplikat. Obwohl es die 'Bonusfrage' beantwortet, beantwortet es nicht die Hauptfrage.
Mark Rotteveel

Antworten:

76

Warum konnten die Architekten von Java uns nicht einfach Folgendes tun lassen:

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

Es könnte heute funktionieren, aber nehmen wir an, dass in den nächsten Java-Versionen ein -myPropArgument als JVM-Option eingeführt wird.
Wie können Sie Ihre -myPropvon der -myPropJVM-Option unterscheiden? Auf keinen Fall.
Es gibt also einen offensichtlichen Grund , Systemeigenschaften -Dzu definieren .

Anstatt -myPropanzunehmen , dass sich Ihr Programm auf eine -clientSystemeigenschaft stützt .
Es wird nicht ausgeführt:

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

Sie hätten einen JVM-Fehler wie:

Nicht erkannte Option: -client = davidxxx

wie -clienteine JVM Standardoption , die keinen Wert erwartet.

Wenn Sie jedoch verwenden -D-client, ist dies jetzt in Ordnung, da hier -Dclienteine Systemeigenschaft definiert ist, die sich von der -clientStandard-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 ( -Daber nicht nur).

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

Sie verwenden , -Dum 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.


davidxxx
quelle
38

"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:

Die Systemklasse 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 Sie Eigenschaften zum Verwalten der Anwendungskonfiguration verwenden.

Rakurai
quelle
Haben Sie Unterlagen dazu?
user7294900
Nach fast zwei Jahren wird mir klar, dass diese Antwort, so brillant sie auch ist, die Bonusfrage beantwortet, anstatt die Notwendigkeit eines Präfixes im Allgemeinen zu erklären. Deshalb habe ich zu einer anderen Antwort als der akzeptierten gewechselt.
Colm Bhandal
9

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.

Deepak Singhal
quelle
Danke, das "X" -Präfix war auch in meinen Gedanken. Wissen Sie, ob andere Buchstaben als "D" und "X" für die Präfixierung spezieller Argumenttypen reserviert sind? Außerdem sehe ich oben, dass Sie unter dem Beispiel für "X" -Präfixe "Djava.compiler" haben. Ist das richtig?
Colm Bhandal
3

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

Das -Dwurde 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.

Henry
quelle