web-dev-qa-db-fra.com

Pourquoi les arguments de la machine virtuelle Java commencent-ils par "-D"?

Pourquoi avons-nous besoin de préfixer les arguments de la machine virtuelle Java avec -D, Par exemple. lors de l'exécution d'un pot à partir de la ligne de commande? Par exemple.

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

est utilisé pour exécuter myProgram.jar avec le paramètre système myProp. Alors pourquoi le premier -D? Pourquoi les architectes de Java ne nous ont-ils pas laissé faire:

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

J'espère une réponse au-delà de "Parce que c'est comme ça".

Question supplémentaire: Pourquoi la lettre -D Par opposition à toute autre lettre, signifie-t-elle quelque chose?


Remarque: Cette question demande à pourquoi il était nécessaire d'utiliser "D", ou toute autre lettre à cet effet , en premier lieu. Il est moins préoccupé par le choix de la lettre "D" que toute autre lettre, bien que cette question soit posée en prime.

La question bonus a une réponse ici: In Java -D Que signifie D?? .

46
Colm Bhandal

Pourquoi les architectes de Java ne nous ont-ils pas laissé faire:

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

Cela pourrait fonctionner aujourd'hui, mais supposons que dans les versions Java suivantes) un argument -myProp Soit introduit en tant qu'option JVM.
Comment distinguer votre -myProp De l'option -myProp De la JVM? En aucune façon.
Il existe donc une raison évidente d’utiliser -D Pour define propriétés système.

Comme autre exemple, au lieu de -myProp, Supposons que votre programme repose sur une propriété système -client.
Il ne fonctionnera pas:

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

Vous auriez une erreur de machine virtuelle Java telle que:

Option non reconnue: -client = davidxxx

as -client est une option standard de la JVM qui n’attend aucune valeur.

Mais si vous utilisez -D-client, Tout va bien, car ici -Dclient Est définie comme une propriété système distincte de l'option JVM standard -client:

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

Ou en utilisant les deux:

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

Pour aller plus loin, tous les arguments de la machine virtuelle Java ne commencent pas par -D. mais la plupart d'entre eux ont un préfixe (-D, -X, -XX) qui permet en quelque sorte de définir des espaces de noms.

Vous avez différentes catégories d'arguments JVM:

1. Options standard (-D Mais pas seulement).

Ce sont les options les plus couramment utilisées qui sont prises en charge par toutes les implémentations de la machine virtuelle Java.

Vous utilisez -D Pour spécifier les propriétés système, mais la plupart d’entre elles n’ont pas de préfixe: -verbose, -showversion, Et ainsi de suite.

2. Options non standard (préfixées par -X)

Ces options sont des options à usage général spécifiques à la Java HotSpot Virtual Machine.
Par exemple: -Xmssize, -Xmxsize

3. Options d'exécution avancées (préfixées par -XX)

Ces options contrôlent le comportement d'exécution de la machine virtuelle HotSpot Java.

4. Options avancées du compilateur JIT (précédées de -XX)

Ces options contrôlent la compilation JIT (Just-In-Time) dynamique effectuée par la Java HotSpot VM.

5. Options de maintenance avancées (préfixées par -XX)

Ces options permettent de collecter des informations sur le système et d’effectuer un débogage approfondi.

6. Options avancées de nettoyage de la mémoire (précédées de -XX)

Ces options contrôlent la manière dont la récupération de place est effectuée par la Java HotSpot VM.


38
davidxxx

"Définir". La signification est similaire à une définition de préprocesseur en C. Le -D signifie que la définition est dans le contexte de l'application, et non dans le contexte de l'interprète Java) comme toute autre option avant le nom de l'exécutable. .

L'utilisation de la lettre "D" n'est pas spécifiquement expliquée dans la documentation , mais la seule utilisation est de "définir" une clé dans la mappe des propriétés système - à l'exception de cette référence:

La classe System gère un objet Properties qui définit la configuration de l'environnement de travail actuel. Pour plus d'informations sur ces propriétés, voir Propriétés système. Le reste de cette section explique comment utiliser les propriétés pour gérer la configuration de l'application.

30
Rakurai

Si vous ne spécifiez rien comme -myProp = "XYZ", cela signifie qu'il est passé en tant qu'argument à la méthode principale du programme.

-D signifie que vous pouvez utiliser cette valeur à l'aide de System.getProperty

-X est utilisé pour les arguments d'extension tels que -Xdebug -Xnoagent -Djava.compiler = NONE -Xrunjdwp: transport = dt_socket, serveur = y, suspendre = y, adresse = 8000

Oui, ils auraient pu interchanger .. les personnages; mais ces caractères sont utilisés pour spécifier quel type de paramètre est passé et qui est le consommateur.

6
Deepak

Sans le -D les propriétés seraient en conflit avec les options normales de la machine virtuelle Java. Par exemple, comment définiriez-vous la propriété jar?

Le -D a probablement été choisi (je ne peux que spéculer à ce sujet) car il est également utilisé dans le pré-processeur C pour définir des symboles et était donc familier à la plupart des gens.

2
Henry