Java の環境変数 JAVA_TOOL_OPTIONS と JDK_JAVA_OPTIONS について


TL;DR

Java のツールが自動的に読み込む環境変数に JAVA_TOOL_OPTIONSJDK_JAVA_OPTIONS があります。

これらの主な違いは、その提供範囲で、以下のようになります。

  • JAVA_TOOL_OPTIONS : java, javac, jar, javadoc などの全てのJavaツール
  • JDK_JAVA_OPTIONS : javaコマンドのみ


JAVA_TOOL_OPTIONS

JAVA_TOOL_OPTIONS 環境変数は、java, javac, jar, javadoc などあらゆるJavaツールが自動的に読み込む環境変数で、JDK 5 から導入されました。

システムプロパティ -Dfile.encoding=UTF-8 やエージェントのロード -javaagent--add-exports--add-opens といった、すべてのJavaツールに共通で適用たいオプションを指定できます(ランチャによって処理されるコマンド行の拡張である -client -server オプションを使ったVM選択などには使用できません)。

この環境変数が設定されている場合、コマンドラインに以下のメッセージが表示されます。

Picked up JAVA_TOOL_OPTIONS: -Dxxxx

この表示が邪魔という意見が大多数なのですが、広範囲に影響を与える環境変数であり、意図しない適用を予防する意味でメッセージ表示されます。 このメッセージは、標準エラー出力に出力されるため、環境によっては以下のようにエラーと誤解させるように出力されることがあります。

javac failed: Picked up JAVA_TOOL_OPTIONS: -Dxxxx


JDK_JAVA_OPTIONS

JDK_JAVA_OPTIONS は JDK 9 から有効になったオプションです。

JAVA_TOOL_OPTIONS とは異なり、javaコマンドのみに適用されます(javac を始めとした他のコマンドには適用されません)。

JAVA_TOOL_OPTIONS と同じオプションが指定されていた場合、JDK_JAVA_OPTIONS で指定されたのもが優先となります(コマンドラインで直接していされたオプションはJDK_JAVA_OPTIONSのものより優先)。

-jar--module-h-version など、JDK_JAVA_OPTIONS に指定できないオプションも存在します(指定されていた場合はエラー)。

JDK_JAVA_OPTIONSが設定されている場合、ランチャはメッセージを標準エラー出力にリマインダとして出力します。

NOTE: Picked up JDK_JAVA_OPTIONS: -D...

JAVA_TOOL_OPTIONS の場合と同じように以下のように出力されることもあります。

java failed: NOTE: Picked up JDK_JAVA_OPTIONS: -D...