使用Java 11时JDK_JAVA_OPTIONS和JAVA_TOOL_OPTIONS之间的确切区别是什么?
它们似乎执行相同的操作,但是输出略有不同。这使我相信他们可能会有不同的用例:
$ JDK_JAVA_OPTIONS="-Dstuff" java Foo
NOTE: Picked up JDK_JAVA_OPTIONS: -Dstuff
$ JDK_JAVA_OPTIONS="illegalStuff" java Foo
NOTE: Picked up JDK_JAVA_OPTIONS: illegalStuff
Error: Cannot specify main class in environment variable JDK_JAVA_OPTIONS
$ JAVA_TOOL_OPTIONS="-Dstuff" java Foo
Picked up JAVA_TOOL_OPTIONS: -Dstuff
$ JAVA_TOOL_OPTIONS="illegalStuff" java Foo
Picked up JAVA_TOOL_OPTIONS: illegalStuff
Unrecognized option: illegalStuff
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
我正在使用一个很小的测试程序:
public class Yo {
public static final void main(String[] args) {
System.out.println(System.getProperty("stuff"));
}
}
它表明JDK_JAVA_OPTIONS
的优先级高于JAVA_TOOL_OPTIONS
:
$ JDK_JAVA_OPTIONS="-Dstuff=jdk" JAVA_TOOL_OPTIONS="-Dstuff=tool" java Yo
NOTE: Picked up JDK_JAVA_OPTIONS: -Dstuff=jdk
Picked up JAVA_TOOL_OPTIONS: -Dstuff=tool
jdk
但是最终命令行会赢:
$ JDK_JAVA_OPTIONS="-Dstuff=jdk" JAVA_TOOL_OPTIONS="-Dstuff=tool" java -Dstuff=cmd Yo
NOTE: Picked up JDK_JAVA_OPTIONS: -Dstuff=jdk
Picked up JAVA_TOOL_OPTIONS: -Dstuff=tool
cmd
但是,在构建时,仅读取JAVA_TOOL_OPTIONS
:
$ JDK_JAVA_OPTIONS="-Dstuff=jdk" JAVA_TOOL_OPTIONS="-Dstuff=tool" javac Yo.java
Picked up JAVA_TOOL_OPTIONS: -Dstuff=tool
我当前正在使用AdoptOpenJDK 11版本28。
答案 0 :(得分:4)
JDK_JAVA_OPTIONS
仅由java
启动器拾取,因此将其用于您仅想应用(或仅对Java启动命令有意义)的选项。该变量在JDK 9+上也是新的,并且会被早期的JDK版本忽略。因此,从旧版本迁移到9+时非常有用。JAVA_TOOL_OPTIONS
也被其他Java工具(例如jar
和javac
)所拾取,因此它应用于要应用(并有效)到所有这些Java工具的标志。答案 1 :(得分:4)
这两个变量之间的功能差异由@gjoranv的答案解释。
我认为输出的差异源于以下内容:
这两个变量似乎在启动过程中的不同地方实现。
JDK_JAVA_OPTIONS
文档说:
为了减轻对JDK_JAVA_OPTIONS行为的潜在滥用,环境变量中不允许指定主类(例如-jar)或导致Java启动器退出而不执行主类的选项(例如-h)。如果这些选项中的任何一个出现在环境变量中,启动器将中止并显示一条错误消息。
此行:
Error: Cannot specify main class in environment variable JDK_JAVA_OPTIONS
是错误消息,警告用户可能尝试通过该变量进行混乱。
我认为JDK_JAVA_OPTIONS
优先,部分原因是相同的。