Groovy Shell警告“无法打开/创build首选项根节点…”
我试图在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.
打印上面的消息后,shell按预期启动。
丹尼斯的回答是正确的。 不过,我想以更详细的方式解释解决scheme(对于Windows用户):
- 进入你的开始菜单并在search字段中input
regedit
。 - 导航到path
HKEY_LOCAL_MACHINE\Software\JavaSoft
(Windows 10似乎现在有这里:HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft
) - 右键单击JavaSoft文件夹,然后单击
New
– >Key
- 命名新的密钥
Prefs
,一切都应该工作。
或者,保存并执行包含以下内容的*.reg
文件:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs]
我能够通过手动创build以下registry项来解决问题:
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
如果有人试图在64位版本的Windows上解决此问题,则可能需要创build以下registry项:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
这实际上是一个JDK错误。 多年来已经有好几次报道,但只有8139507年才被甲骨文认真对待。
问题出在WindowsPreferences.java
的JDK源代码中。 在这个类中,两个节点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);
这意味着第一次引用类时, 两个静态variables都将被启动,并且如果尚不存在,将尝试创buildHKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
(= system tree)的registry项。
因此,即使用户在自己的代码中采取了一切预防措施,也决不会触及或引用系统树,那么JVM实际上仍会尝试实例化systemRoot
,从而导致警告。 这是一个有趣的微妙的错误。
在2016年6月有一个修补程序提交给JDK源代码。看看它是否会被移植到Java 8将会很有趣。
您所看到的实际上是JDK内部logging器的警告。 这不是一个例外。 我相信这个警告可以被安全地忽略….除非用户代码确实想要系统偏好,但是这是非常less见的情况。
奖金信息
这个bug在Java 1.7.21之前的版本中没有透露,因为直到那时JRE安装程序才会为您创buildregistry项HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
,这将有效地隐藏错误。 另一方面,从来没有真正需要运行安装程序才能在您的机器上安装JRE,或者至less这不是Sun / Oracle的意图。 您可能已经知道Oracle已经多年以.tar.gz
格式分发Windows的JRE了。
问题是简单的控制台无法编辑registry。 无需手动编辑registry,只需用行政专家启动groovysh
。 所有后来的发射工作没有错误。
在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解决scheme。 或者你可以创build一个扩展名为“reg”的文件,并在其中写入如下内容:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs]
…然后执行它。
我收到以下消息:
Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002
它创build了这些registry键之一后,我的是64位,所以我只是试图。
32 bit Windows HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs 64 bit Windows HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
这发生在我身上。
显然这是因为Java没有创buildregistry项的权限。
请参阅: Java:java.util.Preferences失败