【问题标题】:What is the difference between JDK_JAVA_OPTIONS and JAVA_TOOL_OPTIONS when using Java 11?使用 Java 11 时 JDK_JAVA_OPTIONS 和 JAVA_TOOL_OPTIONS 有什么区别?
【发布时间】:2019-03-29 21:38:12
【问题描述】:

在使用 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_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


【解决方案1】:

@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 优先,部分原因是相同的。

【讨论】:

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

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 2011-07-11
      • 2021-08-31
      • 2015-04-04
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多