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

Den*_*aub 183 windows groovy groovyshell

我试图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.
Run Code Online (Sandbox Code Playgroud)

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

MKo*_*sch 321

丹尼斯的回答是正确的.但是,我想以更加详细的方式解释该解决方案(对于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]
Run Code Online (Sandbox Code Playgroud)

  • 我的Windows 10安装具有上面指示的两个关键路径,修复我的安装需要将Prefs添加到HKEY_LOCAL_MACHINE\Software\JavaSoft而不是HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft (15认同)
  • 如果在HKEY_CURRENT_USER下完成,我可以确认它不起作用.一个更好的问题,为什么一个基于Java的产品将自己绑定到Windows注册表? (9认同)
  • 是否有可能以此方式执行此操作? (7认同)
  • 但我已经有一个名为Prefs的密钥.那么为什么会出现这个错误?!!! (6认同)
  • 消费者应用程序不可能要求用户使用注册表.为什么Java总是实现这样的半解决方案. (5认同)
  • 在Windows 10上,Perfs文件夹的正确位置是`HKEY_LOCAL_MACHINE\Software\JavaSoft` (2认同)
  • 只需以管理员身份运行失败的应用程序,它将自动创建缺失的密钥.无需弄乱注册表. (2认同)

Den*_*aub 71

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

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
Run Code Online (Sandbox Code Playgroud)

  • 我在我们销售的软件上看到了这一点.如果您也有其中一个,自动/程序化修复会更好.告诉我的最终用户跳进注册表是一个可怕的前景.有没有办法让Java在Windows 8.1上自动执行此操作(这是我看到错误的唯一平台). (14认同)

pet*_*erh 42

这实际上是一个JDK错误.多年来已经多次报道,但仅在8139507中,它最终被甲骨文认真对待.

问题出在JDK源代码中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);
Run Code Online (Sandbox Code Playgroud)

这意味着第一次类被引用静态变量将启动,并通过此注册表项HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs(=系统树)将尝试创建如果它不存在.

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

2016年6月有一个针对JDK源的修复程序,它是Java9以后的一部分.还有一个反向移植了Java8这是U202.

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

奖金信息

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

  • @realsonic.除此之外:似乎Oracle最终还是推迟了这个修复.它[固定在8u202](https://bugs.openjdk.java.net/browse/JDK-8210913).(截至30Sep2018,Java 8的最新版本为u181,因此修复程序已向后移植但尚未发布任何版本) (3认同)

小智 30

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

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
Run Code Online (Sandbox Code Playgroud)

  • 我在64位Windows 7上使用64位JVM时遇到此错误,而Dennis和MKorsch提出的解决方案对我来说效果很好.Wow6432Node解决方案可能适用于64位Windows上的32位JVM. (9认同)

Dar*_*ake 7

问题是简单的控制台无法编辑注册表.无需手动编辑注册表,只需启动groovysh一次管理权限即可.所有后续启动都可以正常运行.

  • 谢谢,我建议其他人尝试一下,这是最简单的解决方案:) (2认同)