问题描述
我认为输出的差异源于以下方面:
-
这两个变量似乎在启动过程中的不同地方实现。
-
该
JDK_JAVA_OPTIONS
文档说:
为了减轻对JDK_JAVA_OPTIONS行为的潜在滥用,环境变量中不允许指定主类(例如- jar)或导致Java启动器退出而不执行主类(例如-h)的选项。如果这些选项中的任何一个出现在环境变量中,启动器将中止并显示一条错误消息。
这行:
Error: Cannot specify main class in environment variable JDK_JAVA_OPTIONS
我认为这JDK_JAVA_OPTIONS
是优先的,部分原因是相同的。
解决方法
使用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 build 28。