Java 11を使用する場合、 JDK_Java_OPTIONS と Java_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
現在、AdoptOpenJDK11ビルド28を使用しています。
2つの変数の機能の違いは、@ gjoranvの回答によって説明されています。
出力の違いは、次のことに起因すると思います。
2つの変数は、起動プロセスの異なるポイントで実装されているようです。
JDK_Java_OPTIONS
ドキュメントによると:
JDK_Java_OPTIONS動作の潜在的な誤用を軽減するために、メインクラス(-jarなど)を指定するオプション、またはメインクラス(-hなど)を実行せずにJavaランチャーを終了させるオプションは次のとおりです。環境変数では許可されていません。これらのオプションのいずれかが環境変数に表示されると、ランチャーはエラーメッセージで中止されます。
この行:
Error: Cannot specify main class in environment variable JDK_Java_OPTIONS
その変数を介して騒乱を行おうとする可能性があることをユーザーに警告するエラーメッセージです。
JDK_Java_OPTIONS
も、同じ理由で優先されます。
JDK_Java_OPTIONS
はJava
ランチャーによってのみ取得されるため、Java起動コマンドのみを適用する(または意味をなす)オプションにのみ使用します。この変数はJDK9以降でも新しく、以前のJDKバージョンでは無視されるため、古いバージョンから9以降に移行する場合に便利です。Java_TOOL_OPTIONS
は他のJava jar
やjavac
などのツールでも取得されるため、適用する(そして有効な)フラグに使用する必要があります)それらすべてのJavaツールに。