Preferences prefs = Preferences.userNodeForPackage(MyClass.class); prefs.get((String)key,"");
在一台新的Windows 8机器上,失败:
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
我找不到我做错了什么Google和SO搜索提供仅与Windows Vista / 7相关的旧结果,其中一个错误地使用systemRoot(How can I write System preferences with Java? Can I invoke UAC?).
通过创建HKLM / Software / JavaSoft / Prefs并将权限设置为HKLM / Software / JavaSoft可以“修复”错误,这里提到这里Java: java.util.Preferences Failing.但这不是我可以要求我的用户在安装程序时要做的事情.
所以我正在寻找一个更好的解决方案.我最后一次的努力是简单的写档案,但我想避免这种情况.这也似乎与I’m trying to use Java Prefences from XML WITHOUT using Windows registry,but I see a Registry-related message相关,但是没有答案就被投票了.
目前我怀疑一个Win8 JVM的bug …
问题
>有人知道一个不涉及写文件的解决方案吗?
>为什么Windows 7中相同的代码可以正常工作,但是在Windows 8中可以惨败?
原来,罪魁祸首是这个静态成员变量:WindowsPreferences.systemRoot
看起来Java尝试初始化WindowsPreferences.systemRoot,以防程序稍后使用,如果程序未以管理员身份运行,那么初始化显然会失败.
由于您使用Preferences.userNodeForPackage(),您将永远不需要systemRoot,因此您可以安全地忽略该警告.
当然,这是一个可怕的做法,Java尝试在没有请求时初始化systemRoot.
更新:我在各种Java版本中测试了这个问题,并得出结论,这个错误是在Java 1.7.0_21中引入的.它在Java 1.7.0_17中工作正常,只是因为该版本的安装程序将在注册表中创建“Pref”文件夹!当然,即使在该版本中,如果要从注册表中删除“Pref”,那么它将停止工作,所以这是Oracle开始的一个愚蠢的解决方案.我将填写错误报告.
更新2:警告消息不是一个错误.这似乎是预期的行为:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6809488