代码之家  ›  专栏  ›  技术社区  ›  neu242

当使用Java11时,JDK\UJava\U选项和JAVA\Utool\U选项之间有什么区别?

  •  2
  • neu242  · 技术社区  · 7 年前

    两者之间的确切区别是什么 JDK_JAVA_OPTIONS JAVA_TOOL_OPTIONS 使用Java 11时?

    我在用一个小小的测试程序:

    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
    

    不过,在建造时 读作:

    $ JDK_JAVA_OPTIONS="-Darg=jdk" JAVA_TOOL_OPTIONS="-Darg=tool" javac Foo.java
    Picked up JAVA_TOOL_OPTIONS: -Darg=tool
    

    我目前使用的是OpenJDK11Build28。

    2 回复  |  直到 5 年前
        1
  •  10
  •   Stephen C    7 年前

    两个变量之间的函数差异可以用@gjoranv的答案来解释。

    我认为产出的差异来自以下几点:

    1. 这两个变量似乎在发射过程中的不同点实现。

    2. 这个 JDK_JAVA_OPTIONS 文件上说:

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

      这条线:

       Error: Cannot specify main class in environment variable JDK_JAVA_OPTIONS
      

      是一条错误消息,警告用户可能试图通过该变量进行破坏。

      我认为 JDK\U JAVA\U选项 优先,部分原因是一样的。

        2
  •  21
  •   gjoranv    7 年前
    • JDK_JAVA_OPTIONS 只会被 java 启动程序,所以将其用于只想应用(或仅对java启动命令有意义)的选项。这个变量在jdk9+上也是新的,早期的JDK版本将忽略它。因此,它在从旧版本迁移到9+时非常有用。
    • JAVA_TOOL_OPTIONS 也被其他java工具如 jar javac 因此,它应该用于要应用于所有这些java工具(并且是有效的)的标志。