Java - 设置首选项backingstore目录

时间:2013-02-21 14:38:02

标签: java linux jvm preferences

我需要在我的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无效。有什么建议吗? 提前谢谢!

3 个答案:

答案 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下的文件不是全局可写的,因为用户可能会更改其他用户的设置,并被视为一种安全漏洞,即用户的预期环境。例如,粗心的员工(或心怀不满的员工)可能会一举消灭所有其他用户的偏好。