Почему аргументы 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 для определения символов и поэтому был знаком большинству людей.