Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JAVA 11时,JDK_JAVA_选项和JAVA_工具_选项之间有什么区别?_Java_Jvm_Jvm Arguments_Java 11 - Fatal编程技术网

使用JAVA 11时,JDK_JAVA_选项和JAVA_工具_选项之间有什么区别?

使用JAVA 11时,JDK_JAVA_选项和JAVA_工具_选项之间有什么区别?,java,jvm,jvm-arguments,java-11,Java,Jvm,Jvm Arguments,Java 11,使用Java11与使用Java11的确切区别是什么 我正在使用一个小型测试程序: public class Foo { public static final void main(String[] args) { System.out.println("arg: " + System.getProperty("arg")); } } 这两个环境变量的作用似乎相同,但输出略有不同。这让我相信他们可能有不同的用例: $ JDK_JAVA_OP

使用Java11与使用Java11的确切区别是什么

我正在使用一个小型测试程序:

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\u JAVA\u选项
优先于
JAVA\u工具\u选项

$ 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\u工具\u选项

$ JDK_JAVA_OPTIONS="-Darg=jdk" JAVA_TOOL_OPTIONS="-Darg=tool" javac Foo.java
Picked up JAVA_TOOL_OPTIONS: -Darg=tool
我目前正在使用AdoptOpenJDK 11 build 28。

  • JDK_JAVA_OPTIONS
    仅由
    JAVA
    启动程序拾取,因此将其用于仅希望应用(或仅对)JAVA启动命令的选项。这个变量在JDK 9+上也是新的,早期的JDK版本将忽略它。因此,当从旧版本迁移到9+时,它非常有用
  • JAVA\u-TOOL\u-OPTIONS
    也被其他JAVA工具(如
    jar
    javac
    )所选择,因此它应该用于您想要应用(并且有效)到所有这些JAVA工具的标志

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

我认为产出的差异来自以下方面:

  • 这两个变量似乎在启动过程中的不同点实现

  • JDK\u JAVA\u选项
    文档说明:

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

    这一行:

     Error: Cannot specify main class in environment variable JDK_JAVA_OPTIONS
    
    是一条错误消息,警告用户可能试图通过该变量进行破坏

    我认为
    JDK\u JAVA\u OPTIONS
    优先,部分原因是相同的


  • 它们不是你想定义的环境变量吗?@nullpointer我不知道你的意思?两者都可以成功地用于设置
    java
    的选项,但它们的实现似乎略有不同(基于
    java
    命令的输出)。一些相关的东西:,@Henry,谢谢,我已经看过了。但是他们没有回答我的问题。。。