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用户):
regedit
搜索字段.HKEY_LOCAL_MACHINE\Software\JavaSoft
(10的Windows似乎现在有这样的位置:HKEY_LOCAL_MACHINE\Software\WOW6432Node\JavaSoft
)New
- >Key
Prefs
,一切都应该有效.或者,保存并执行*.reg
包含以下内容的文件:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs]
Run Code Online (Sandbox Code Playgroud)
Den*_*aub 71
我能够通过手动创建以下注册表项来解决此问题:
HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
Run Code Online (Sandbox Code Playgroud)
pet*_*erh 42
这实际上是一个JDK错误.多年来已经多次报道,但仅在8139507中,它最终被甲骨文认真对待.
问题出在JDK源代码中WindowsPreferences.java
.在这一类中,这两个节点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);
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 .
小智 30
如果有人试图在64位版本的Windows上解决此问题,您可能需要创建以下密钥:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs
Run Code Online (Sandbox Code Playgroud)
问题是简单的控制台无法编辑注册表.无需手动编辑注册表,只需启动groovysh
一次管理权限即可.所有后续启动都可以正常运行.
归档时间: |
|
查看次数: |
144582 次 |
最近记录: |