我有一个Java应用程序,它使用:
从Preferences
读取
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.
错误代码5 访问被拒绝。
我找不到任何我做错的事。谷歌搜索和搜索引擎搜索只会显示与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错误......
答案 0 :(得分:13)
我最近开始注意到同样的警告,并认为这意味着无法编写注册表。但仔细观察后,我注意到所有首选项都在HKEY_CURRENT_USER中成功更新。所以我很好奇为什么我会看到这个警告。
原来,罪魁祸首是这个静态成员变量: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