【发布时间】:2019-03-29 21:38:12
【问题描述】:
在使用 Java 11 时,JDK_JAVA_OPTIONS 和 JAVA_TOOL_OPTIONS 之间的确切区别是什么?
我正在使用一个小型测试程序:
public class Foo {
public static final void main(String[] args) {
System.out.println("arg: " + System.getProperty("arg"));
}
}
这两个环境变量似乎做的一样,但输出略有不同。这让我相信他们可能有不同的用例:
$ JDK_JAVA_OPTIONS="-Darg=jdk" java Foo
NOTE: Picked up JDK_JAVA_OPTIONS: -Darg
arg: jdk
$ JAVA_TOOL_OPTIONS="-Darg=tool" java Foo
Picked up JAVA_TOOL_OPTIONS: -Darg
arg: tool
$ JDK_JAVA_OPTIONS="illegalArg" java Foo
NOTE: Picked up JDK_JAVA_OPTIONS: illegalArg
Error: Cannot specify main class in environment variable JDK_JAVA_OPTIONS
$ JAVA_TOOL_OPTIONS="illegalArg" java Foo
Picked up JAVA_TOOL_OPTIONS: illegalArg
Unrecognized option: illegalArg
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
似乎JDK_JAVA_OPTIONS 优先于JAVA_TOOL_OPTIONS:
$ JDK_JAVA_OPTIONS="-Darg=jdk" JAVA_TOOL_OPTIONS="-Darg=tool" java Foo
NOTE: Picked up JDK_JAVA_OPTIONS: -Darg=jdk
Picked up JAVA_TOOL_OPTIONS: -Darg=tool
arg: jdk
但最终还是命令行获胜:
$ JDK_JAVA_OPTIONS="-Darg=jdk" JAVA_TOOL_OPTIONS="-Darg=tool" java -Darg=cmd Foo
NOTE: Picked up JDK_JAVA_OPTIONS: -Darg=jdk
Picked up JAVA_TOOL_OPTIONS: -Darg=tool
arg: cmd
不过,在构建时,只会读取 JAVA_TOOL_OPTIONS:
$ JDK_JAVA_OPTIONS="-Darg=jdk" JAVA_TOOL_OPTIONS="-Darg=tool" javac Foo.java
Picked up JAVA_TOOL_OPTIONS: -Darg=tool
我目前正在使用 AdoptOpenJDK 11 build 28。
【问题讨论】:
-
它们不应该是您可以根据需要定义的环境变量吗?
-
@nullpointer 我不确定你的意思?两者都可以成功地用于设置
java的选项,但它们的实现似乎略有不同(基于java命令的输出)。 -
@Henry 谢谢,我已经看到了。不过,他们没有解决我的问题……
标签: java jvm jvm-arguments java-11