web-dev-qa-db-ja.com

Groovy Shell警告「設定ルートノードを開く/作成できませんでした...」

Windows 8でGroovy Shell(groovysh)を開こうとしたところ、次のような出力が得られました。

Java.util.prefs.WindowsPreferences <init>
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs 
at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.

上記のメッセージを表示した後、シェルは期待どおりに起動しました。

178
Dennis Traub

デニスの答えは正しいです。しかし、私はもう少し詳しく(Windowsユーザーのために)解決策を説明したいと思います。

  1. スタートメニューを開き、検索フィールドにregeditと入力します。
  2. パスHKEY_LOCAL_MACHINE\Software\JavaSoftに移動します(Windows 10では、これがここにあります:HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft
  3. JavaSoftフォルダを右クリックしてNew - > Keyをクリックします。
  4. 新しいキーにPrefsという名前を付けると、すべてうまくいくはずです。

あるいは、以下の内容の*.regファイルを保存して実行します。

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs]
315
MKorsch

次のレジストリキーを手動で作成して問題を解決することができました。

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
71
Dennis Traub

これは実際にはJDKのバグです。何年にもわたって何度か報告されていますが、 8139507 だけがオラクルにようやく真剣に受け止められたのです。

問題はWindowsPreferences.JavaのJDKソースコードにありました。このクラスでは、両方のノードuserRootsystemRootが次のように静的に宣言されました。

/**
 * 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用の backport もあります。

あなたが見ることは本当にJDKの内部ロガーからの警告です。例外ではありません。ユーザーコードが本当にシステム設定を望んでいるのでない限り、警告は無視しても差し支えないと私は思いますが、そうであることは非常にまれです。

ボーナス情報

Java 1.7.21より前のバージョンでは、このバグ自体は明らかになりませんでした。それまではJREインストーラがレジストリキーHKEY_LOCAL_MACHINE\Software\JavaSoft\Prefsを作成していたため、事実上バグが隠されていたためです。一方、あなたのマシンにJREをインストールするためにインストーラーを実行することを実際に要求されたことは一度もありませんでした。ご存知かもしれませんが、Oracleは長年にわたってJRE for Windowsを.tar.gz形式で配布してきました。

39
peterh

誰かが64ビットバージョンのWindowsでこれを解決しようとしている場合は、次のキーを作成する必要があります。

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
30
walkern

問題は、単純なコンソールではレジストリを編集できないことです。手動でレジストリを編集する必要はありません。管理権限でgroovyshを一度起動するだけです。それ以降の起動はすべてエラーなしで動作します。

6
Darksnake

Windows 8 64 bitでApache jmeterを起動すると、同様の問題が発生しました。

[]Apache-jmeter-2.13\bin>jmeter
Java.util.prefs.WindowsPreferences <init>
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs     at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.

Mkorschの説明付きで、Dennis Traubソリューションの使用に成功しました。あるいは、拡張子が "reg"のファイルを作成して、それに以下のように書き込めます。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs]

...それを実行します。

2
razvanone

次のようなメッセージが表示されました。

Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002

そして、それはこれらのレジストリキーの1つを作成した後になくなりました、私のものは64ビットですので、私はそれだけを試しました。

32 bit Windows
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

64 bit Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
1
Sohail Ahmed

これは私に起こりました。

どうやらそれはJavaがレジストリキーを作成する権限を持っていないためです。

参照してください。 Java:Java.util.Preferences Failing

1
Wassa

EclipseでGWTコンパイルプロジェクトを実行するときに同じ警告を受け取りました。承認された解決策もそれを修正しました。

0
Craigo