为什么JVM参数以“ -D”开头?


77

为什么-D从命令行运行jar时,为什么需要在JVM参数前面加上前缀?例如

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

9
@BackSlash我想了解他们的“为什么”,而不仅仅是“让事情起作用”。
Colm Bhandal

所有好的答案;不幸的是我只能接受一个。谢谢大家的启发!
Colm Bhandal


1
@Autar不是重复的。尽管它回答了“奖金问题”,但并未回答主要问题。
Mark Rotteveel

Answers:


76

为什么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

就像-clientJVM标准选项一样,它没有价值。

但是,如果您使用-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

这些选项控制Java HotSpot VM执行的动态实时(JIT)编译。

5.高级可维护性选项(带有前缀-XX

这些选项提供了收集系统信息和执行广泛调试的能力。

6.高级垃圾收集选项(带有前缀-XX

这些选项控制Java HotSpot VM如何执行垃圾回收(GC)。



38

“定义”。含义类似于C中的预处理器定义。-D表示该定义在应用程序的上下文中,而不是在Java解释器上下文中,而不是在可执行文件名之前的任何其他选项。

文档中没有特别说明字母“ D”的用法,但唯一的用途是在系统属性映射中“定义”键-对此引用除外:

System类维护一个Properties对象,该对象定义当前工作环境的配置。有关这些属性的更多信息,请参见系统属性。本节的其余部分说明如何使用属性来管理应用程序配置。


您是否有相关文档?
user7294900

经过将近两年的时间,我意识到,这个答案非常出色,它回答了奖金问题,而不是一般地解释前缀的必要性,因此我改用另一个答案作为公认的答案。
Colm Bhandal

9

如果未指定-myProp =“ XYZ”之类的内容,则表示将其作为参数传递给程序的main方法。

-D表示可以通过System.getProperty使用此值

-X用于扩展参数-Xdebug -Xnoagent -Djava.compiler = NONE -Xrunjdwp:transport = dt_socket,server = y,suspend = y,address = 8000

是的,他们可以互换..字符;但是这些字符用于指定传递什么类型的参数以及谁是使用者。


谢谢,我也想到了“ X”前缀。您是否知道除了“ D”和“ X”以外是否还有其他字母可保留用于特殊类型的参数的前缀?另外,在上面,我看到您在“ X”前缀的示例下有“ Djava.compiler”。它是否正确?
Colm Bhandal

3

没有这些-D属性,将与常规JVM选项冲突。例如,您将如何设置属性jar

-D很可能选择(我只能推测有关),因为它是在C预处理器还用于定义符号,因此是最熟悉的人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.