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


188

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

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



1
保存在文件中作为后备存储的首选项应完全避免出现此问题。在某些情况下,依靠最终用户更改其可恶的注册表不是可行的解决方案。
戴夫·贾维斯

2
这是一个已知的Java错误,仍存在于Windows 10和更新112上。只需在提升的提示符下运行该程序一次,它就会消失。
david.pfx

Answers:


328

丹尼斯答案是正确的。但是,我想以更详细的方式来解释该解决方案(对于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]

7
是否可以通过编程方式做到这一点?
2013年

12
我可以确认如果在HKEY_CURRENT_USER下完成,它将无法正常工作。一个更好的问题,为什么基于Java的产品将自己与Windows注册表绑定在一起?
avgvstvs 2014年

5
消费者应用程序不可能要求用户去修改注册表。为什么Java总是这样实现半解决方案。
El Mac

15
我的Windows 10安装具有上述两个关键路径,修复了我的安装要求,将Prefs添加到HKEY_LOCAL_MACHINE \ Software \ JavaSoft而不是HKEY_LOCAL_MACHINE \ Software \ WOW6432Node \ JavaSoft
gt124,2013年

2
在Windows 10上,Perfs文件夹的正确位置是HKEY_LOCAL_MACHINE\Software\JavaSoft
Arthur

72

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

HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

您介意告诉我确切的过程吗?我主要在Mac上工作,但是在Windows上运行程序时遇到此错误,我想知道如何修复它。
Meshulam Silk 2013年

14
我在我们出售的软件上看到了这一点。如果您也有一个自动/程序修复,则更好。告诉我的最终用户加入regedit是一个可怕的前景。有没有办法让Java在Windows 8.1(这是我看到错误的唯一平台)上自动完成此操作。
Brian Knoblauch

Windows 10中也会发生错误,并且此修复程序有效
TriumphST

45

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

问题出在的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);

这意味着,第一次引用该类时,将初始化两个静态变量,并且如果该类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 。


感谢您的深入分析。您提到的问题8139507说,该错误已在JDK 9中
修复。– realsonic

3
@realsonic。补充说明:看来Oracle终于可以解决这个问题了。它固定在8u202中。(截至
2018年

30

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

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs

9
在64位Windows 7上使用64位JVM时遇到此错误,Dennis和MKorsch提出的解决方案对我来说效果很好。也许Wow6432Node解决方案适用于64位Windows上的32位JVM。
Scott Johnson

7

问题在于简单的控制台无法编辑注册表。无需手动编辑注册表,只需groovysh使用管理权限启动一次即可。所有后续启动均正常运行。


2
谢谢,我建议其他人尝试一下,这是最简单的解决方法:)
Aditya T

1
最简单的答案应该在最上面。我在执行JMeter测试时收到此警告,但是一旦以管理员身份运行jmeter.bat,警告就消失了。
KB

2

在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.

成功使用Dennis Traub解决方案,并附有Mkorsch的说明。或者,您可以创建扩展名为“ reg”的文件,并在其中写入以下内容:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs]

...然后执行它。


1

我收到以下消息:

Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002

创建了这些注册表项之一后,它就消失了,我的是64位的,所以我只尝试了一下。

32 bit Windows
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

64 bit Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs

1

这发生在我身上。

显然是因为Java没有创建注册表项的权限。

请参阅:Java:java.util.Preferences失败


好吧,更确切地说,这是因为JDK中存在一个错误。在答案中的链接上查看接受的答案。
彼得

这不是真正的错误-机器范围的设置仅允许机器管理员用户使用。用于runas以本地管理员用户身份运行您的应用程序,它将很高兴在HKLM下创建注册表项。Java没有的机制是要求提高权限的机制(即,理想情况下,它会调用Windows UAC而不是失败-这是否是一个普遍的好主意,这令人怀疑)。
ddimitrov '19

0

问题确实是缺少注册密钥。可以手动创建

要么

可以通过以管理员身份运行一次程序来自动创建它。这将为程序提供所需的权限,并且在正常运行时仍可以正常运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.