我尝试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.
打印完上述消息后,外壳程序按预期方式启动。
我想以更详细的方式来解释该解决方案(对于Windows用户):
或者,保存并执行*.reg包含以下内容的文件:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs]
这实际上是一个JDK错误。多年来,已经对其进行了多次报告,但是直到8139507才被Oracle认真对待。
问题出在的JDK源代码中WindowsPreferences.java。在此类中,两个节点userRoot和systemRoot都声明为静态,如:
WindowsPreferences.java
/** * 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不存在,则将尝试为此创建注册表项(=系统树)。
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 。
Windows .tar.gz