我需要在我的Java应用程序中创build一个持久存储,以便所有用户都可以访问它。 所以我正在研究java.util.prefs.Preferences和使用systemRoot()在我的Windows上工作正常,保存在registry的数据。 但是我真的在Linux(Ubuntu)上面临一些问题。 我想使用其他应用程序已经使用的目录:/ usr / share /。 所以,我试图在运行时将systemRoot默认目录redirect到/ usr / share。 这是我的代码:
System.setProperty("java -Djava.util.prefs.systemRoot", "/usr/share/myfolder"); Preferences pref = Preferences.systemRoot().node("/usr/share/myfolder");
根据这个网站 ,我必须在执行这个命令行之前创build.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不工作。 任何build议? 提前致谢!
在Linux系统中, 系统根偏好节点将位于/etc 。 这是由于历史原因造成的,并且是由Linux标准库规定的标准。 任何非系统偏好都可以在其他位置进行,但是将系统偏好放在其他地方违反了操作系统的设计。
在Linux系统中,你的定义是无效的,因为它不能在/ etc开始。 显然,Java代码中的某些东西会根据您决定重新设置首选项根目录的操作系统规范。
通常情况下,这些文件不受世界(或甚至大多数用户)可写入的影响而不受修改。 这意味着对于用户有权访问首选项,他们应该去
Preferences.userRoot()
这将把他们放置在他们的主目录(他们将有修改权限)的隐藏目录。
如果你希望任何用户读取其他用户的喜好(说明听起来像你可能),那么你将需要有一个安装程序作为一个足够的授权用户(通常是root)运行,使/etc下所需的目录,并更改它的权限成为世界可写的。
通常情况下,/ etc下的文件不是世界可写的,因为用户可以改变其他用户的设置,并且考虑到用户预期环境的安全违规类型。 例如,粗心的员工(或者不满意的员工)可能会一举消灭所有其他用户的偏好。
比马莱什建议,而不是
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
这是在基于* nix的服务器上运行的一个令人讨厌的问题。
我能够通过使用以下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)。