我需要在我的Java应用程序中创建持久存储,以便所有用户都可以访问它.所以我正在研究java.util.prefs.Preferences并使用systemRoot()在Windows上正常工作,在Register中保存数据.
但我真的在Linux(Ubuntu)上面临一些问题.我想使用其他应用程序已经使用的目录:/usr/share /.
所以,我正在尝试在运行时将systemRoot默认目录重定向到/usr/share.这是我的代码:
System.setProperty("java -Djava.util.prefs.systemRoot", "/usr/share/myfolder");
Preferences pref = Preferences.systemRoot().node("/usr/share/myfolder");
根据这个site,我必须在执行这个命令行之前创建.systemPrefs文件夹,并隐含systemRoot()将使用它.
当我执行我的程序时,我得到以下警告:
java.util.prefs.FileSystemPreferences syncWorld
警告无法刷新系统首选项:java.util.prefs.BackingStoreException:/etc/.java/.systemPrefs/usr create failed.
所以我假设System.setProperty不起作用.有什么建议吗?
提前致谢!
解决方法:
在Linux系统中,系统根首选项节点将位于/ etc下.这是由于历史原因,并且是由Linux标准库管理的标准.任何非系统偏好都可以在其他位置进行,但是系统偏好转移到其他位置会违反操作系统的设计.
赔率是你的定义在Linux系统中无效,因为它无法从/ etc开始.显然,Java代码中的某些内容违反了操作系统的规范,而不是您决定重新定义首选项根目录.
通常,这些文件不会被世界(或甚至大多数用户)写入而受到保护以免被修改.这意味着,对于用户可以访问“首选项”,他们应该进入
Preferences.userRoot()
这将把它们放在主目录之外的隐藏目录中(它们将具有修改权限).
如果您希望任何用户阅读任何其他用户的首选项(说明听起来像您可能),那么您将需要一个以充分授权的用户(通常是root)运行的安装程序,以在/ etc下创建所需的目录并更改其权限成为世界可写的.
通常,/ etc下的文件不是全局可写的,因为用户可以更改其他用户的设置,并且被认为是用户预期环境的一种安全漏洞.例如,粗心的员工(或心怀不满的员工)可以一举消灭所有其他用户的偏好.