web-dev-qa-db-ja.com

Java 11を使用する場合のJDK_Java_OPTIONSとJava_TOOL_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_OPTIONSJava_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

現在、AdoptOpenJDK11ビルド28を使用しています。

9
neu242

2つの変数の機能の違いは、@ gjoranvの回答によって説明されています。

出力の違いは、次のことに起因すると思います。

  1. 2つの変数は、起動プロセスの異なるポイントで実装されているようです。

  2. JDK_Java_OPTIONSドキュメントによると:

    JDK_Java_OPTIONS動作の潜在的な誤用を軽減するために、メインクラス(-jarなど)を指定するオプション、またはメインクラス(-hなど)を実行せずにJavaランチャーを終了させるオプションは次のとおりです。環境変数では許可されていません。これらのオプションのいずれかが環境変数に表示されると、ランチャーはエラーメッセージで中止されます。

    この行:

     Error: Cannot specify main class in environment variable JDK_Java_OPTIONS
    

    その変数を介して騒乱を行おうとする可能性があることをユーザーに警告するエラーメッセージです。

    JDK_Java_OPTIONSも、同じ理由で優先されます。

7
Stephen C
  • JDK_Java_OPTIONSJavaランチャーによってのみ取得されるため、Java起動コマンドのみを適用する(または意味をなす)オプションにのみ使用します。この変数はJDK9以降でも新しく、以前のJDKバージョンでは無視されるため、古いバージョンから9以降に移行する場合に便利です。
  • Java_TOOL_OPTIONSは他のJava jarjavacなどのツールでも取得されるため、適用する(そして有効な)フラグに使用する必要があります)それらすべてのJavaツールに。
8
gjoranv