微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用Java 11时,JDK_JAVA_OPTIONS和JAVA_TOOL_OPTIONS有什么区别?

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

解决方法

使用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 build 28。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。