196

我尝试groovysh在 Windows 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.

打印上述消息后,shell 按预期启动。

4

9 回答 9

336

丹尼斯的答案是正确的。但是,我想以更详细的方式解释解决方案(对于 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]
于 2013-07-09T15:58:12.577 回答
75

我能够通过手动创建以下注册表项来解决问题:

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
于 2013-05-07T20:35:31.707 回答
49

这实际上是一个 JDK 错误。这些年被报道了好几次,但只有8139507才最终被甲骨文认真对待。

问题出在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。

于 2016-12-14T19:51:40.057 回答
32

如果有人试图在 64 位版本的 Windows 上解决此问题,您可能需要创建以下密钥:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
于 2013-12-27T09:28:00.083 回答
7

问题是简单的控制台无法编辑注册表。无需手动编辑注册表,只需groovysh使用管理权限启动一次。所有后续启动工作都没有错误。

于 2016-09-04T11:49:26.893 回答
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.

成功使用 Dennis Traub 解决方案,并附有 Mkorsch 解释。或者您可以创建一个扩展名为“reg”的文件,并在其中写入以下内容:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs]

...然后执行它。

于 2015-05-11T12:03:35.613 回答
1

这发生在我身上。

显然这是因为 Java 没有创建注册表项的权限。

请参阅:Java:java.util.Preferences 失败

于 2016-10-25T07:47:09.457 回答
1

我收到以下消息:

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

在创建这些注册表项之一后它就消失了,我的是 64 位的,所以我只尝试了那个。

32 bit Windows
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

64 bit Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
于 2016-06-18T12:14:16.637 回答
0

问题确实是缺少注册键。可以手动创建

或者

它可以通过以管理员身份运行程序一次来自动创建。这将为程序提供所需的权限,并且当它正常运行时,它仍然可以正常工作。

于 2019-11-07T10:25:07.123 回答