【问题标题】:preferences-systems tries to write a lock file at a location where "normal" users have no write permissions on Linux首选项系统尝试在“普通”用户在 Linux 上没有写入权限的位置写入锁定文件
【发布时间】:2011-09-06 20:25:53
【问题描述】:

我正在使用系统偏好来测试我的代码,我在 java 1.5 上观察到了一些奇怪的东西

private void loadEmptyPreferences() throws IOException,
            InvalidPreferencesFormatException, BackingStoreException {
        ClassLoader contextClassLoader = Thread.currentThread()
                .getContextClassLoader();
        InputStream stream = contextClassLoader
                .getResourceAsStream("example.xml");
        if (stream == null) {
            fail("Could not load preferences file");
        }
        Preferences pref = Preferences.systemRoot().node("test");
        pref.removeNode();
        Preferences.importPreferences(stream);
    }

我明白了

java.lang.SecurityException:无法锁定系统首选项。锁定文件访问被拒绝。 在 java.util.prefs.FileSystemPreferences.checkLockFile0ErrorCode(FileSystemPreferences.java:919) 在 java.util.prefs.FileSystemPreferences.lockFile(FileSystemPreferences.java:908) 在 java.util.prefs.FileSystemPreferences.removeNode(FileSystemPreferences.java:656)

原因是首选项系统尝试在“普通”用户在 Linux 上没有写入权限的位置写入锁定文件(/opt/j2se/linux/ix86/j2se_1.5.0_22/jre/.systemPrefs /.system.lock)

如何解决这个问题?我们应该使用属性吗?

【问题讨论】:

标签: java linux preferences


【解决方案1】:

Preferences.systemRoot() 返回系统范围(即仅根)首选项。非特权用户无法更改它们。

如果您需要为普通用户更改设置,请尝试改用userRoot()

【讨论】:

  • 我在 Ubuntu 虚拟机上遇到了同样的问题,但我的应用程序中没有使用 Preferences.systemRoot()。这似乎来自 JVM API。
【解决方案2】:

这是一个在基于 *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)的用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2019-11-14
    相关资源
    最近更新 更多