Чому аргументи JVM починаються з “-D”?


81

Чому нам потрібно префіксувати аргументи JVM, -Dнаприклад, під час запуску jar з командного рядка? Напр

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

використовується для запуску myProgram.jarіз системним параметром myProp. То чому провідний -D? Чому архітектори Java не могли дозволити нам просто зробити:

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

Я сподіваюся на відповідь далі, ніж просто "Тому що це так".

Бонусне запитання: чому лист -D, на відміну від будь-якого іншого, означає щось?


Примітка: Це запитання задає питання, чому спочатку потрібно було використовувати "D" або будь-яку іншу букву. Її менше турбує вибір конкретної літери "D" перед будь-якою іншою буквою, хоча це задається як бонусне питання.

Тут є відповідь на бонусне запитання: У java -D що означає D? .


Це гарне запитання для розробників Oracle / Sun. До речі, чому це проблема для вас?
BackSlash

10
@BackSlash Мені подобається розуміти, що вони "чому" не просто "змусити речі працювати".
Колм Бхандал

Усі чудові відповіді; на жаль, я можу прийняти лише одне. Дякую, хлопці, за просвіту!
Колм Бхандал

3
Можливий дублікат In Java - D, що означає D?
Автар

1
@Autar Це не дублікат. Хоча він відповідає на "бонусне питання", він не відповідає на основне питання.
Марк Роттевіл,

Відповіді:


80

Чому архітектори Java не могли дозволити нам просто зробити:

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

Це може працювати сьогодні, але припустимо, що в наступних версіях Java -myPropаргумент вводиться як опція JVM.
Як відрізнити свій варіант -myPropвід -myPropJVM? У жодному разі.
Отже, існує очевидна причина для використання -Dдля визначення властивостей системи.

Як інший приклад, замість того, щоб -myPropприпустити, що ваша програма покладається на -clientсистемну властивість.
Він не працюватиме:

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

Ви мали б помилку JVM, таку як:

Невизнаний варіант: -client = davidxxx

як -clientстандартний варіант JVM, який не очікує значення.

Але якщо ви використовуєте -D-client, тепер це нормально, оскільки тут -Dclientвизначено як системну властивість, яка відрізняється від -clientстандартної опції JVM:

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

Або використовуючи обидва:

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

Щоб піти далі, не всі аргументи JVM починаються з -D. але більшість з них має префікс ( -D, -X,-XX ) , що дозволяє в деякому образі визначити простір імен.

У вас є різні категорії аргументів JVM:

1. Стандартні параметри ( -Dале не тільки).

Це найбільш часто використовувані варіанти, які підтримуються усіма реалізаціями JVM.

Ви можете використовувати -Dдля визначення властивостей системи , але більшість з них не мають ніякого префікса: -verbose, -showversionі тому для ...

2. Нестандартні параметри (з префіксом -X)

Ці параметри є загальними параметрами, характерними для віртуальної машини Java HotSpot.
Наприклад :-Xmssize ,-Xmxsize

3. Розширені параметри виконання (з префіксом -XX)

Ці параметри контролюють поведінку середовища виконання Java HotSpot VM.

4. Розширені параметри компілятора JIT (з префіксом -XX)

Ці параметри контролюють динамічну компіляцію "точно в час" (JIT), виконувану Java HotSpot VM.

5. Розширені параметри обслуговування (з префіксом -XX)

Ці параметри надають можливість збирати системну інформацію та виконувати великі налагодження.

6. Розширені параметри збору сміття (з префіксом -XX )

Ці параметри контролюють, як збір сміття (GC) виконується Java HotSpot VM.



38

"Визначити". Значення схоже на визначення препроцесора в C. Значення -D означає, що визначення знаходиться в контексті програми, а не в контексті інтерпретатора Java, як будь-який інший варіант перед ім'ям виконуваного файлу.

Використання літери "D" конкретно не пояснюється в документації , але єдиним використанням є "визначення" ключа на карті властивостей системи - за винятком цього посилання:

Клас System підтримує об'єкт Properties, який визначає конфігурацію поточного робочого середовища. Докладніше про ці властивості див. У розділі Властивості системи. Решта цього розділу пояснює, як використовувати властивості для управління конфігурацією програми.


у вас є документація про це?
user7294900

Через майже два роки я усвідомлюю, що, наскільки блискучою є ця відповідь, вона відповідає на бонусне питання, а не пояснює потребу в префіксі загалом, тому я перейшов до іншої відповіді як прийнятої.
Колм Бхандал

11

Якщо ви не вказуєте нічого на зразок -myProp = "XYZ", це означає, що воно передається як аргумент до основного методу програми.

-D означає, що ви можете використовувати це значення за допомогою System.getProperty

-X використовується для аргументів розширення, таких як -Xdebug -Xnoagent -Djava.compiler = NONE -Xrunjdwp: transport = dt_socket, server = y, suspend = y, address = 8000

Так, вони могли поміняти місцями .. персонажів; але ці символи використовуються для вказівки, який тип параметра передається та хто є споживачем.


Дякую, префікс "Х" теж був у мене на думці. Чи знаєте ви, чи є інші букви, крім "D" та "X", зарезервовані для префікса спеціальних типів аргументів? Крім того, у наведеному вище, я бачу, у вас є "Djava.compiler" під прикладом префіксів "X". Це правильно?
Колм Бхандал

3

Без -Dвластивостей це може суперечити звичайним параметрам JVM. Наприклад, як би ви встановили властивість jar?

-D, Ймовірно , вибрали (я можу тільки здогадуватися про те , що) , так як він також використовується в C препроцесора для визначення символів , і тому знайомі більшості людей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.