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用户):

  1. 进入你的开始菜单并在search字段中inputregedit
  2. 导航到pathHKEY_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] 

我能够通过手动创build以下registry项来解决问题:

 HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs 

如果有人试图在64位版本的Windows上解决此问题,则可能需要创build以下registry项:

 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs 

这实际上是一个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); 

这意味着第一次引用类时, 两个静态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失败