我需要在我的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
WARNING Couldn't flush system prefs: java.util.prefs.BackingStoreException: /etc/.java/.systemPrefs/usr create failed.
所以我假设System.setProperty
无效。有什么建议吗?
提前谢谢!
答案 0 :(得分:7)
Bimalesh建议不要
System.setProperty("java -Djava.util.prefs.systemRoot", "/usr/share/myfolder")
,你说
System.setProperty("-Djava.util.prefs.systemRoot", "/usr/share/myfolder")
。
但您尝试设置的属性名称为java.util.prefs.systemRoot
,而不是-Djava.util.prefs.systemRoot
,因此您应该
System.setProperty("java.util.prefs.systemRoot", "/usr/share/myfolder");
如果这不起作用,请尝试将“-D”开关添加到启动程序的命令行。那就是
java -D...
应该去。该命令将以
java -Djava.util.prefs.systemRoot=/usr/share/myfolder
答案 1 :(得分:5)
在基于* nix的服务器上运行Java是一个非常棘手的问题。
我能够通过使用以下vm args来解决它:
-Djava.util.prefs.userRoot=/opt/apache-tomcat-7.0.50/uprefs -Djava.util.prefs.systemRoot=/opt/apache-tomcat-7.0.50/sprefs
systemRoot
路径上的一个重要注意事项是在其中创建一个名为.systemPrefs
的子文件夹,否则它将无效。
另外,不要忘记chown -R
这些目录给运行java应用程序的用户(在我的例子中是tomcat)。
答案 2 :(得分:4)
在Linux系统中, System 根首选项节点将位于/etc
下。这是由于历史原因,并且是由Linux标准库管理的标准。任何非系统偏好都可以在其他位置进行,但是如果系统偏好转到其他地方则违反了操作系统的设计。
您的定义在Linux系统中无效,因为它无法从/ etc启动。显然,Java代码中的某些内容违反了操作系统的规范,而不是您决定重新定义首选项根目录。
通常,这些文件不会被世界(甚至大多数用户)写入而受到保护以免被修改。这意味着,如果用户可以访问“偏好设置”,则应将其置于
之下 Preferences.userRoot()
将它们放在主目录之外的隐藏目录中(它们将具有修改权限)。
如果您希望任何用户阅读任何其他用户的首选项(说明听起来像您可能),那么您将需要一个以充分授权的用户(通常是root用户身份)运行的安装程序,以便在{{1并将其权限更改为世界可写。
通常,/ etc下的文件不是全局可写的,因为用户可能会更改其他用户的设置,并被视为一种安全漏洞,即用户的预期环境。例如,粗心的员工(或心怀不满的员工)可能会一举消灭所有其他用户的偏好。