Windows Groovy外壳警告“;无法打开/创建prefs根节点…“;
我尝试在Windows 8上打开Groovy Shell(Windows Groovy外壳警告“;无法打开/创建prefs根节点…“;,windows,groovy,groovyshell,Windows,Groovy,Groovyshell,我尝试在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. java.util.
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.
java.util.prefs.WindowsPreferences
警告:无法打开/创建prefs根节点Software\JavaSoft\prefs
在根目录0x8000002处。Windows RegCreateKeyEx(…)返回错误代码5。
打印上述消息后,shell按预期启动。我可以通过手动创建以下注册表项来解决此问题:
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
丹尼斯的回答是正确的。但是,我想以更详细的方式解释解决方案(针对Windows用户):
regedit
HKEY\U LOCAL\U MACHINE\Software\JavaSoft
(Windows 10现在似乎有这样一个路径:HKEY\U LOCAL\U MACHINE\Software\WOW6432Node\JavaSoft
)New
->键
Prefs
,一切都会正常工作*.reg
文件:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs]
如果有人试图在64位版本的Windows上解决此问题,您可能需要创建以下密钥:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
在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.
。。。然后执行它。我收到了以下消息:
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
问题是简单控制台无法编辑注册表。无需手动编辑注册表,只需使用管理权限启动一次
groovysh
。所有后续的发射都能正常工作。这发生在我身上
显然,这是因为Java没有创建注册表项的权限
请参阅:这实际上是一个JDK错误。在过去的几年里,它已经被报道了好几次,但直到年,它才最终被甲骨文认真对待 问题出在
WindowsPreferences.java
的JDK源代码中。在此类中,节点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\U LOCAL\U MACHINE\Software\JavaSoft\Prefs
(=系统树)的注册表项(如果它不存在)
因此,即使用户在自己的代码中采取了一切预防措施,并且从未接触或引用系统树,JVM实际上仍然会尝试实例化systemRoot
,从而导致警告。这是一个有趣而微妙的错误
2016年6月,JDK源代码发布了一个补丁,它是Java9的一部分。u202中还有一个用于Java8的接口
您看到的实际上是来自JDK内部记录器的警告。这也不例外。我相信这个警告可以被安全地忽略。。。。除非用户代码确实需要系统首选项,但这种情况很少发生
奖金信息
在Java 1.7.21之前的版本中,该漏洞没有出现,因为在此之前,JRE安装程序会为您创建注册表项
HKEY\U LOCAL\U MACHINE\Software\JavaSoft\Prefs
,这将有效地隐藏该漏洞。另一方面,您从来没有被要求运行安装程序才能在您的机器上安装JRE,或者至少Sun/Oracle没有这样做的意图。您可能知道,Oracle多年来一直以.tar.gz
格式分发用于Windows的JRE。问题确实是缺少注册表项。它可以手动创建
或
它可以通过以管理员身份运行一次程序自动创建。这将为程序提供所需的权限,当程序正常运行时,它仍能正常工作。您介意告诉我确切的过程吗?我主要在Mac上工作,但当我在Windows上运行我的程序时,我遇到了这个错误,我想知道如何修复它。我在我们销售的软件上看到了这个错误。如果您也有一个自动/编程修复程序,那么它会更好。告诉我的最终用户跳入regedit是一个可怕的前景。有没有办法让Java在Windows 8.1(这是我唯一看到错误的平台)上自动执行此操作。错误也发生在Windows 10中,并且此修复程序可以以编程方式执行此操作?我可以确认,如果在HKEY_CURRENT_用户下执行此操作,它将无法工作。还有一个更好的问题,为什么基于Java的产品会将自己绑定到Windows注册表?消费者应用程序不可能要求用户去修改注册表。为什么Java总是实现这样的半解决方案。我的Windows 10安装有上面指出的两个关键路径,修复我的安装需要将Prefs添加到Windows 10上的HKEY_LOCAL_MACHINE\Software\JavaSoft而不是HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft。Perfs文件夹的正确位置仍然是
HKEY_LOCAL_MACHINE\Software\JavaSoft
我在64位Windows 7上使用64位JVM时出现此错误,丹尼斯和MKorsch提出的解决方案对我很有效。可能Wow6432Node解决方案是针对64位Windows上的32位JVM的。这是由于一个错误:首选项保存在一个文件中,作为应该完全避免这个问题。在某些情况下,依赖最终用户来更改其应用程序并不是一个可行的解决方案。这是一个在WIndows 10和update 112上仍然存在的已知Java bug。只要在提升的提示符下运行一次程序,它就会消失。更确切地说,这是因为JDK中有一个bug。请在您的答案中的链接上查看接受的答案。这并不是一个真正的错误-机器范围的设置只允许机器管理员用户使用。使用runas
以本地管理员用户身份运行您的应用程序,它将愉快地创建
/**
* 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);