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


188

groovyshWindows 8でGroovy Shell()を開こうとすると、次の出力が得られました。

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.

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



1
バッキングストアとしてファイルに保存された設定は、問題を完全に回避するはずです。エンドユーザーが悪質なレジストリを変更することに頼るのが現実的な解決策ではない状況があります
Dave Jarvis

2
これは、Windows 10とアップデート112にまだ存在する既知のJavaバグです。管理者特権のプロンプトからプログラムを1回実行するだけで、プログラムは消えます。
david.pfx 2018年

回答:


328

デニスの答えは正しいです。ただし、私はソリューションをもう少し詳細に説明したいと思います(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]

7
これをプログラム的に行うことは可能ですか?
facetoe 2013年

12
HKEY_CURRENT_USERで実行すると、動作しないことを確認できます。より良い質問ですが、なぜJavaベースの製品がWindowsレジストリに結び付いているのでしょうか。
avgvstvs 2014

5
コンシューマーアプリケーションでは、ユーザーがレジストリを操作する必要はありません。なぜJavaは常にこのようなハーフソリューションを実装するのですか?
El Mac

15
私のWindows 10のインストールには上記の両方の主要なパスがあり、HKEY_LOCAL_MACHINE \ Software \ WOW6432Node \ JavaSoftではなくHKEY_LOCAL_MACHINE \ Software \ JavaSoftにPrefsを追加する必要がある私のインストールを修正しました
gt124

2
Windows 10でも、Perfsフォルダーの適切な場所はHKEY_LOCAL_MACHINE\Software\JavaSoft
Arthur

72

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

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

正確なプロセスを教えていただけませんか?私は主にMacで作業していますが、Windowsでプログラムを実行するとこのエラーが発生します。その修正方法を知りたいのですが。
Meshulam Silk 2013

14
私たちが販売しているソフトウェアでこれを見ています。自動/プログラムによる修正は、それらのいずれかを入手している場合に適しています。エンドユーザーにregeditにジャンプするように伝えるのは恐ろしい見通しです。JavaがWindows 8.1でこれを自動的に行うようにする方法はありますか(これはエラーが表示される唯一のプラットフォームです)。
Brian Knoblauch 2013年

エラーはWindows 10でも発生し、この修正は機能しました
TriumphST

45

これは実際にはJDKのバグです。それは何年にもわたって数回報告されてきましたが、8139507でのみ、それは最終的にOracleによって真剣に受け止められました。

問題はのJDKソースコードにありましたWindowsPreferences.java。このクラスでは、両方のノード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のバックポートもあります。

実際に表示されるのは、JDKの内部ロガーからの警告です。例外ではありません。ユーザーコードが実際にシステム設定を必要としているのでない限り、警告は無視しても安全だと思いますが、それは非常にまれです。

ボーナス情報

Java 1.7.21より前のバージョンでは、このバグは明らかになりませんでした。それまでは、JREインストーラーがレジストリキーHKEY_LOCAL_MACHINE\Software\JavaSoft\Prefsを作成し、これによりバグを効果的に隠すことができたためです。一方、JREをマシンにインストールするためにインストーラーを実行する必要がまったくなかったか、少なくともSun / Oracleの意図ではありません。ご存知かもしれませんが、Oracleは.tar.gz長年にわたってWindows用のJREをフォーマットで配布しています。


そのような深い分析をありがとう。あなたが言及した問題8139507は、バグがJDK 9で修正されたと述べています
realsonic

3
@realsonic。それに加えて:Oracleはようやくこの修正のバックポートに取り掛かったようです。8u202修正されています。(
2018

30

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

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs

9
64ビットのWindows 7で64ビットのJVMを使用しているときにこのエラーが発生しました。DennisとMKorschが提案したソリューションは私にとってはうまくいきました。おそらく、Wow6432Nodeソリューションは、64ビットWindows上の32ビットJVM用です。
スコットジョンソン

7

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


2
おかげで、私は他の人にこれを試すことをお勧めします、それは最も簡単な解決策です:)
Aditya T

1
最も簡単な答えが一番です。JMeterテストを実行するときにこの警告が表示されましたが、管理者としてjmeter.batを開始すると警告が表示されなくなりました。
KB

2

Windows 8 64ビットで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]

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


1

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

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

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

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

参照:Java:java.util.Preferences Failing


より正確には、JDKにバグがあるためです。回答のリンクで承認された回答を確認してください。
peterh 2017年

これは実際にはバグではありません。マシン全体の設定は、マシン管理者ユーザーにのみ許可されています。runasローカル管理者ユーザーとしてアプリケーションを実行するために使用すると、HKLMの下にレジストリキーが作成されます。Javaにないのは、高い権限を要求するメカニズムです(つまり、理想的には、失敗するのではなくWindows UACを呼び出したはずです。それが普遍的に良い考えかどうかは疑問です)。
ddimitrov

0

問題は確かに欠落している登録キーです。手動で作成できます

または

プログラムを管理者として一度実行すると、自動的に作成されます。これにより、プログラムに必要なアクセス許可が与えられ、通常どおり実行されても、正しく機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.