一尘不染

Groovy Shell警告“无法打开/创建首选根节点……”

windows

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

打印完上述消息后,外壳程序按预期方式启动。


阅读 476

收藏
2020-09-19

共2个答案

一尘不染

我想以更详细的方式来解释该解决方案(对于Windows用户):

  1. 进入“开始”菜单,然后输入regedit搜索字段。
  2. 导航到路径HKEY_LOCAL_MACHINE\Software\JavaSoft(10的Windows似乎现在有这样的位置: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]
2020-09-19
一尘不染

这实际上是一个JDK错误。多年来,已经对其进行了多次报告,但是直到8139507才被Oracle认真对待。

问题出在的JDK源代码中WindowsPreferences.java。在此类中,两个节点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);

这意味着,第一次引用该类时,将启动两个静态变量,并且如果该类HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs不存在,则将尝试为此创建注册表项(=系统树)。

因此,即使用户在自己的代码中采取了所有预防措施,并且从未接触或引用系统树,JVM仍将实际尝试实例化systemRoot,从而引起警告。这是一个有趣的细微错误。

JDK源代码已在2016年6月发布了一个修复程序,它是Java9以后的一部分。还有一个反向移植了Java8这是U202。

您看到的实际上是来自JDK内部记录器的警告。这也不例外。我相信可以安全地忽略警告....除非用户代码确实想要系统偏好设置,但是这种情况很少发生。

奖金信息

该错误不会在Java 1.7.21之前的版本中显示出来,因为在此之前,JRE安装程序将为您创建注册表项HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs,这将有效地隐藏该错误。另一方面,您实际上并不需要运行安装程序才能在计算机上安装JRE,或者至少这不是Sun / Oracle的意图。如您所知,Oracle多年来一直以Windows .tar.gz格式分发JRE for Windows 。

2020-09-19