我有一个 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 是拒绝访问。
我找不到任何我做错的事。 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 错误...
最佳答案
我最近开始注意到相同的警告,并认为这意味着无法写入注册表。但经过仔细检查,我注意到所有首选项都已在 HKEY_CURRENT_USER 中成功更新。所以我很好奇为什么我会看到这个警告。
原来罪魁祸首是这个静态成员变量:WindowsPreferences.systemRoot
看起来 Java 会尝试初始化 WindowsPreferences.systemRoot,以防程序稍后使用它,如果程序未以管理员身份运行,则初始化显然会失败。
由于您使用的是 Preferences.userNodeForPackage(),因此您永远不需要 systemRoot,因此您可以安全地忽略该警告。
当然,Java 在没有请求时尝试初始化 systemRoot 是一种可怕的做法。
更新:我在各种Java版本中测试了这个问题,得出的结论是这个bug是在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
关于java - 在新的 Windows 8 上读取和写入 Java 首选项失败,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18559000/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht