Windows Groovy外壳警告“;无法打开/创建prefs根节点…“;

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.

我尝试在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.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
  • 右键单击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);