3

我需要在我的 Java 应用程序中创建一个持久存储,以便所有用户都可以访问它。因此,我正在研究java.util.prefs.PreferencessystemRoot()在 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");

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

4

3 回答 3

8

这是在基于 *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)。

于 2014-02-24T21:09:49.697 回答
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

于 2013-07-23T16:33:16.970 回答
5

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

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

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

 Preferences.userRoot()

这会将它们放置在其主目录之外的隐藏目录中(它们将具有修改权限)。

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

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

于 2013-02-21T14:48:47.907 回答