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

2022-09-01 07:43:16

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


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

答案 2

这两个变量之间的函数差异可以通过@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


推荐