使用Java 11时,JDK_JAVA_OPTIONS和JAVA_TOOL_OPTIONS有什么区别?

时间:2018-10-25 09:58:48

标签: java jvm jvm-arguments java-11

使用Java 11时JDK_JAVA_OPTIONSJAVA_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。

2 个答案:

答案 0 :(得分:4)

  • JDK_JAVA_OPTIONS仅由java启动器拾取,因此将其用于您仅想应用(或仅对Java启动命令有意义)的选项。该变量在JDK 9+上也是新的,并且会被早期的JDK版本忽略。因此,从旧版本迁移到9+时非常有用。
  • JAVA_TOOL_OPTIONS也被其他Java工具(例如jarjavac)所拾取,因此它应用于要应用(并有效)到所有这些Java工具的标志。

答案 1 :(得分:4)

这两个变量之间的功能差异由@gjoranv的答案解释。

我认为输出的差异源于以下内容:

  1. 这两个变量似乎在启动过程中的不同地方实现。

  2. JDK_JAVA_OPTIONS文档说:

      

    为了减轻对JDK_JAVA_OPTIONS行为的潜在滥用,环境变量中不允许指定主类(例如-jar)或导致Java启动器退出而不执行主类的选项(例如-h)。如果这些选项中的任何一个出现在环境变量中,启动器将中止并显示一条错误消息。

    此行:

     Error: Cannot specify main class in environment variable JDK_JAVA_OPTIONS
    

    是错误消息,警告用户可能尝试通过该变量进行混乱。

    我认为JDK_JAVA_OPTIONS优先,部分原因是相同的。