Почему аргументы JVM начинаются с "-D"?

Почему нам нужно -D префикс 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? ,

Ответ 1

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

Использование буквы "D" специально не объясняется в документации, но единственное использование - "определить" ключ на карте свойств системы - за исключением этой ссылки:

Класс System поддерживает объект Properties, который определяет конфигурацию текущей рабочей среды. Для получения дополнительной информации об этих свойствах см. Свойства системы. В оставшейся части этого раздела объясняется, как использовать свойства для управления конфигурацией приложения.

Ответ 2

Почему архитекторы Java не могут просто сделать:

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

Это может работать сегодня, но предположим, что в следующих версиях Java аргумент -myProp вводится как опция JVM.
Как отличить ваш -myProp от -myProp JVM? Ни за что.
Таким образом, существует очевидная причина использовать -D для определения системных свойств.

В качестве другого примера, вместо -myProp предположим, что ваша программа использует системное свойство -client.
Это не будет работать:

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

У вас будет ошибка JVM, такая как:

Нераспознанная опция: -client = davidxxx

-client - это стандартная опция JVM, которая не имеет значения.

Но если вы используете -D-client, теперь все в порядке, так как здесь -Dclient определяется как системное свойство, отличное от стандартного параметра JVM -client:

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.

4. Дополнительные параметры JIT-компилятора (с префиксом -XX)

Эти параметры управляют динамической JIT-компиляцией, выполняемой виртуальной машиной Java HotSpot.

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

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

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

Эти параметры определяют, как сборка мусора (GC) выполняется виртуальной машиной Java HotSpot.


Ответ 3

Если вы не укажете что-нибудь вроде -myProp = "XYZ", это означает, что он передается как аргумент основному методу программы.

-D означает, что вы можете использовать это значение, используя System.getProperty

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

Да, они могли бы поменять местами... персонажи; но эти символы используются для указания того, какой тип параметра передается и кто является потребителем.

Ответ 4

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

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