93 votes

Pourquoi les arguments du JVM commencent-ils par "-D"?

Pourquoi avons-nous besoin de préfixer les arguments JVM avec -D par exemple lors de l'exécution d'un jar à 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 -D en tête? Pourquoi les architectes de Java ne nous ont-ils pas simplement permis de faire :

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

J'espère une réponse qui va au-delà de simplement "C'est comme ça que ça se passe".

Question bonus : Pourquoi la lettre -D au lieu de toute autre lettre, cela signifie-t-il quelque chose?


Remarque : Cette question demande pourquoi il a été nécessaire d'utiliser "D", ou toute autre lettre d'ailleurs, en premier lieu. Elle se préoccupe moins du choix de la lettre spécifique "D" par rapport à toute autre lettre, bien que cela soit demandé en tant que question bonus.

La question bonus a une réponse ici : Dans java -D que signifie le D?.

0 votes

C'est une bonne question pour les développeurs Oracle/Sun. Au fait, pourquoi est-ce un problème pour vous?

15 votes

@BackSlash J'aime comprendre le "pourquoi" au-delà du simple "faire fonctionner les choses".

0 votes

Toutes les bonnes réponses; malheureusement, je ne peux en accepter qu'une seule. Merci les gars pour l'illumination!

94voto

davidh Points 107

Pourquoi les architectes de Java n'ont-ils pas simplement permis de faire:

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

Cela pourrait fonctionner aujourd'hui, mais imaginons que dans les prochaines versions de Java, un argument -myProp soit introduit en tant qu'option JVM.
Comment distinguer votre -myProp de l'option -myProp JVM ? Impossible.
Il existe donc une raison évidente d'utiliser -D pour définir des propriétés système.

Par exemple, au lieu de -myProp, supposez que votre programme dépende d'une propriété système -client.
Cela ne fonctionnera pas :

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

Vous obtiendrez une erreur JVM telle que :

Option non reconnue : -client=davidxxx

car -client est une option standard JVM qui n'attend aucune valeur.

Mais si vous utilisez -D-client, tout va bien car ici -Dclient est défini en tant que propriété système distincte de l'option standard JVM -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 JVM ne commencent pas par -D. mais la plupart 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).

Il s'agit des options les plus couramment utilisées et prises en charge par toutes les implémentations de la JVM.

Vous utilisez -D pour spécifier les propriétés système, mais la plupart n'ont pas de préfixe : -verbose, -showversion, et ainsi de suite...

2. Options non standard (précédées de -X)

Ces options sont des options générales spécifiques à la machine virtuelle Java HotSpot.
Par exemple : -Xmssize, -Xmxsize

3. Options d'exécution avancées (précédées de -XX)

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

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

Ces options contrôlent la compilation just-in-time dynamique effectuée par la machine virtuelle Java HotSpot.

5. Options avancées de serviceabilité (précédées de -XX)

Ces options offrent la possibilité de recueillir des informations système et de réaliser un débogage approfondi.

6. Options avancées de collecte des déchets (précédées de -XX)

Ces options contrôlent la manière dont la collecte des déchets (GC) est effectuée par la machine virtuelle Java HotSpot.


44voto

Rakurai Points 488

"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éteur 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 le seul usage est de "définir" une clé dans la map des propriétés système - à l'exception de cette référence :

La classe System maintient un objet Properties qui définit la configuration de l'environnement de travail actuel. Pour en savoir plus 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.

0 votes

Avez-vous de la documentation à ce sujet ?

1 votes

Après presque deux ans, je réalise que, aussi brillante que cette réponse soit, elle répond à la question bonus plutôt que d'expliquer le besoin d'un préfixe en général, j'ai donc choisi une autre réponse comme celle acceptée.

14voto

Deepak Points 1754

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

-D signifie que vous pouvez utiliser cette valeur en utilisant System.getProperty

-X est utilisé pour des arguments d'extension comme -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000

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

0 votes

Merci, le préfixe "X" était aussi dans mes pensées. Savez-vous s'il existe d'autres lettres que "D" et "X" réservées pour préfixer des types spéciaux d'arguments? De plus, dans l'exemple ci-dessus, je vois que vous avez "Djava.compiler" sous l'exemple pour les préfixes "X". Est-ce correct?

4voto

Henry Points 14061

Sans le -D, les propriétés entreraient en conflit avec les options normales de la JVM. 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X