これは実際には 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 を形式で配布してきました。