在新的Windows 8上,从/到Java首选项的读取和写入失败,

时间:2013-09-01 13:42:24

标签: java windows-8 registry preferences

我有一个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相关的旧结果,其中一个错误地使用systemRootHow 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错误......

问题

  • 是否有人知道不涉及编写文件的解决方案?
  • 为什么相同的代码在Windows 7中完全正常,但在Windows 8中却惨遭失败?

1 个答案:

答案 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