当前位置: 首页 > 知识库问答 >
问题:

Groovy Shell警告“无法打开/创建prefs根节点...”

唐阳飇
2023-03-14

我试图在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按预期启动。

共有3个答案

左丘涵畅
2023-03-14

这实际上是一个JDK bug。多年来已经报告了几次,但直到8139507才最终被Oracle重视。

问题出在WindowsPreferences的JDK源代码中。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(=system tree)的注册表密钥,如果它还不存在。

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

2016年6月,JDK源代码得到了修复,它是Java9之后的一部分。u202中还有一个Java8的后端口。

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

该错误并未在Java1.7.21之前的版本中显示出来,因为在此之前JRE安装程序会为您创建注册表项HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs,这将有效地隐藏该错误。另一方面,您从未真正被要求运行安装程序,以便在您的机器上安装JRE,或者至少这不是Sun/Oracle的意图。正如您可能知道的那样,Oracle多年来一直以.tar.gz格式分发适用于Windows的JRE。

丘飞
2023-03-14

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

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
方寒
2023-03-14

丹尼斯的回答是正确的。不过,我想更详细地解释一下解决方案(针对Windows用户):

  1. 进入您的开始菜单并在搜索字段中键入注册表
  2. 导航到路径HKEY_LOCAL_MACHINE\Software\JavaSoft(Windows 10现在似乎在这里有这个:HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft
  3. 右键单击JavaSoft文件夹并单击New-

或者,保存并执行*。reg包含以下内容的文件:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs]
 类似资料:
  • 问题内容: 我尝试groovysh在Windows 8上打开Groovy Shell(),并得到以下输出: 打印完上述消息后,外壳程序按预期方式启动。 问题答案: 我想以更详细的方式来解释该解决方案(对于Windows用户): 进入“开始”菜单,然后输入regedit搜索字段。 导航到路径HKEY_LOCAL_MACHINE\Software\JavaSoft(10的Windows似乎现在有这样的

  • 我试图在我的Ubuntu上安装androidSDK,但当我试图在tools/bin/sdkmanager文件夹上运行SDK管理器时,我得到以下消息: 我的Ubuntu是最近安装的,除了Java8和Android Studio之外什么都没有。 我的SDK文件夹是默认的~/android/SDK。

  • 技巧 你的程序编译通过了,但并不意味着已经万事大吉,也许还存在一些不规范的地方,或者一些错误隐患。建议,使用-Wall选项打开所有的警告信息,把所有的警告都处理掉。 $ gcc -Wall ... 详情参见 gcc手册

  • 嘿,我总是出错 警告:move_uploaded_file(路径):无法打开流:/Users/Shared/xampp htdocs/php reports/upload中的权限被拒绝。php第27行 我的index.php密码是 我的php代码是 我还将目录设置为 chmod 777

  • 在MacOS升级到Big Sur并将netbeans_jdkhome更改为netbeans.conf文件后,应用程序打开并运行,但无法打开我的项目之一,因为文档下的项目文件框显示为空内容(当然我的文件也在那里)。 也不可能创建一个新项目,包括一些日志消息: Apache NetBeans 11.2和12.2也存在同样的问题。 所以我想Netbeans是不允许访问磁盘上的文件的。我进入了我的“系统”

  • 我想让MIDI音频播放,但当我这样做时,它一直返回错误。 我已经进入,我的权限在