爪哇 - 设置首选项备份存储目录(Java - Setting Preferences backin

2019-07-20 08:07发布

我需要在我的Java应用程序来创建一个持久存储,以便所有用户都可以访问它。 所以,我正在学习有关java.util.prefs.Preferences使用systemRoot()正常工作对我来说在Windows上,在注册保存数据。 但我真的面临着在Linux(Ubuntu的)一些问题。 我想用其他的我们的应用程序已经使用了目录:在/ usr /共享/。 所以,我想重定向systemRoot在运行时的默认目录为/ usr /股。 这里是我的代码:

System.setProperty("java -Djava.util.prefs.systemRoot", "/usr/share/myfolder");
Preferences pref = Preferences.systemRoot().node("/usr/share/myfolder");

根据这个网站 ,我要创建.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不工作。 任何建议? 提前致谢!

Answer 1:

在Linux系统中, 系统根首节点将承受/etc 。 这是由于历史,是由Linux标准基础规范的标准。 任何非系统预置可以去其他地方,但它违反了操作系统的设计,以有系统的偏好去别的地方。

赔率是你的定义是在Linux系统中无效的,因为它没有在/等开始。 在Java代码中很明显的东西在你决定重新基地偏好根推迟到操作系统的规范。

通常,这样的文件是由不被世界(甚至是大多数用户)可写反对修改保护。 这意味着用户能够访问偏好,他们应该去下

 Preferences.userRoot()

将它们放在隐藏目录,就在他们的家目录(在那里他们将有修改权限)。

如果您希望任何用户读取其他用户的喜好(描述听起来像你可能),那么你就需要有运行作为一个充分授权的用户(通常是root)的安装程序来进行下所需目录/etc和改变它的权限成为世界可写。

在/ etc文件通常都没有可写为用户更换其他的用户设置,然后可能,并认为是一类安全漏洞,用户的预期的环境中。 例如,一个不小心的雇员(或不满的一个)可以消灭所有其他用户的喜好一举。



Answer 2:

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



Answer 3:

这是在基于* nix的服务器,一个真正讨厌的问题的Java运行。

我可以通过使用以下VM参数传递给解决这个问题:

-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的)。



文章来源: Java - Setting Preferences backingstore directory