これは実際にはJDKのバグです。それは何年にもわたって数回報告されてきましたが、8139507でのみ、それは最終的にOracleによって真剣に受け止められました。
問題はのJDKソースコードにありましたWindowsPreferences.java
。このクラスでは、両方のノードuserRoot
とsystemRoot
が次のように静的に宣言されています。
/**
* User root node.
*/
static final Preferences userRoot =
new WindowsPreferences(USER_ROOT_NATIVE_HANDLE, WINDOWS_ROOT_PATH);
/**
* System root node.
*/
static final Preferences systemRoot =
new WindowsPreferences(SYSTEM_ROOT_NATIVE_HANDLE, WINDOWS_ROOT_PATH);
つまり、クラスが初めて参照されるときに両方の静的変数が開始され、これによってレジストリキーHKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
(=システムツリー)がまだ存在しない場合は、作成が試行されます。
したがって、ユーザーが自分のコードであらゆる予防措置を講じ、システムツリーに触れたり参照したりしなかったとしても、JVMは実際にインスタンス化を試みsystemRoot
、警告を引き起こします。それは興味深い微妙なバグです。
2016年6月にJDKソースにコミットされた修正があり、Java9以降の一部です。u202にあるJava8のバックポートもあります。
実際に表示されるのは、JDKの内部ロガーからの警告です。例外ではありません。ユーザーコードが実際にシステム設定を必要としているのでない限り、警告は無視しても安全だと思いますが、それは非常にまれです。
ボーナス情報
Java 1.7.21より前のバージョンでは、このバグは明らかになりませんでした。それまでは、JREインストーラーがレジストリキーHKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
を作成し、これによりバグを効果的に隠すことができたためです。一方、JREをマシンにインストールするためにインストーラーを実行する必要がまったくなかったか、少なくともSun / Oracleの意図ではありません。ご存知かもしれませんが、Oracleは.tar.gz
長年にわたってWindows用のJREをフォーマットで配布しています。