Java - 设置首选项backingstore目录

Leo*_*rdo 3 java linux jvm preferences

我需要在我的Java应用程序中创建持久存储,以便所有用户都可以访问它.所以我在Windows上研究java.util.prefs.Preferences和使用systemRoot()对我来说很好的工作,在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");
Run Code Online (Sandbox Code Playgroud)

根据这个站点,我必须.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不起作用.有什么建议吗?提前致谢!

小智 7

比马勒什建议不要

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


Edw*_*uck 5

在 Linux 系统中,系统根首选项节点将位于/etc. 这是由于历史原因,并且是由 Linux 标准库管理的标准。任何非系统首选项都可以放在其他位置,但是将系统首选项放在其他位置是违反操作系统设计的。

很可能您的定义在 Linux 系统中无效,因为它无法从 /etc 启动。显然,Java 代码中的某些内容遵循操作系统的规范,而不是您决定重新设置首选项根的基础。

通常,此类文件通过不可全局(或什至大多数用户)不可写来防止修改。这意味着要让用户访问首选项,他们应该在

 Preferences.userRoot()
Run Code Online (Sandbox Code Playgroud)

这会将它们放置在它们的主目录旁边的隐藏目录中(在那里它们将具有修改权限)。

如果您希望任何用户阅读任何其他用户的首选项(描述听起来像您可能会这样做),那么您将需要一个安装程序以足够授权的用户(通常是 root)身份运行,以创建所需的目录/etc并将其权限更改为世界可写。

通常 /etc 下的文件是不可写的,因为用户可能会更改其他用户的设置,并且被认为是对用户预期环境的一种安全破坏。例如,一个粗心的员工(或一个心怀不满的员工)可能会一次性抹掉所有其他用户的偏好。


aco*_*hen 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
Run Code Online (Sandbox Code Playgroud)

但是在systemRoot路径上的一个重要注意事项是在其中创建一个名为的子文件夹,.systemPrefs否则它将无法工作.

另外,不要忘记chown -R这些目录给运行java应用程序的用户(在我的例子中是tomcat).