【问题标题】:What is the proper way to store app's conf data in Java?用Java存储应用程序的conf数据的正确方法是什么?
【发布时间】:2008-10-11 17:29:38
【问题描述】:

您在哪里存储 J2SE 应用程序的用户特定机器特定运行时配置数据?

(例如,Windows 上的 C:\Users\USERNAME\AppData\Roaming 和 Unix 上的 /home/username)

如何以独立于平台的方式在文件系统中获取这些位置?

【问题讨论】:

    标签: java configuration


    【解决方案1】:

    首先是格式:

    1. Java property files 适用于键/值对(也自动处理换行符)。通过使用“点符号”可以实现一定程度的结构。缺点是该结构不允许您轻松枚举顶级配置实体并以向下钻取的方式工作。最适合用于一小组通常可调整的特定于环境的设置
    2. XML 文件 - 经常用于各种 Java 框架(尤其是 J2EE 和 Spring)的更复杂的配置。我建议您至少了解Spring - 即使您决定不使用它,它也包含许多值得了解的想法。如果您决定推出自己的 XML 配置,我建议您使用带有自定义序列化选项的 XStream,或者如果您只需要解析一些 XML,请查看 XOM。 BTW Spring 还允许您插入自定义 XML 配置语言,但它是 relatively complex task。 XML 配置最适合用于最终用户看不到或无法调整的更复杂的“内部”配置。
    3. 序列化 Java 对象 - 一种快速简便的方法来保持对象的状态并在以后恢复它。如果您编写配置 GUI 并且您不关心配置是否是人类可读的,这很有用。升级课程时请注意compatibility issues
    4. 首选项 - 在Java 1.4 中引入,允许您在特定于平台的存储中存储键入的文本、数字、字节数组和其他原语。在 Windows 上,即注册表(您可以在 HKLMHKCU 下的 /Software/JavaSoft/Prefs 之间进行选择)。在 Unix 下,相同的 API 在用户 home 或 /etc 下创建文件。每个 prefs 配置单元都可以作为 XML 文件导出和导入。您可以通过将“java.util.prefs.PreferencesFactory”JVM 属性设置为您的实现类名称来指定PreferencesFactory 接口的自定义实现。

    通常,根据您的应用场景,使用 prefs API 可能是好事也可能是坏事。

    1. 如果您打算在具有不同配置的同一台机器上运行相同代码的多个版本,那么使用 Preferences API 是个坏主意。
    2. 如果您计划在受限环境(Windows 域或严格管理的 Unix 机器)中使用该应用程序,您需要确保您有权访问必要的注册表项/目录。这不止一次让我感到意外。
    3. 请注意漫游配置文件(复制的主目录),当涉及多台活动计算机时,它们会弥补一些有趣的场景。
    4. 首选项不像应用程序目录下的配置文件那么明显。大多数桌面支持人员并不期待也不喜欢他们。

    关于首选项的文件布局,它再次取决于您的应用程序。一个通用的建议是:

    1. 在根目录或 /META-INF 目录下将大部分 XML 文件打包到应用程序的 JAR 中。这些文件将是只读的,并被视为应用程序的私有文件。
    2. 将用户可修改的配置放在 $APP_HOME/conf 下。它应该主要由属性文件和偶尔的简单 XML 文件(XStream 序列化)组成。这些文件在安装过程中进行了调整,通常用户无法使用。
    3. 在用户主目录下的点目录(即“~/.myapplication”)中存储任何用户配置。用户配置可能会覆盖应用程序 conf 目录中的配置。从应用程序中进行的任何更改都在这里(另请参阅下一点)。
    4. 您还可以使用 $APP_HOME/var 目录来存储特定于此应用程序实例(而不是用户)的任何其他可变数据。这种方法的另一个优点是您可以通过一个目录的简单副本来移动和备份整个应用程序及其配置。

    这说明了一些用于管理配置的标准技术。您可以使用不同的库和工具来实现它们,从原始 JRE、添加 Spring/Guice 或使用完整的 J2EE 容器(可能带有嵌入式 Spring)

    其他管理配置的方法是:

    1. 使用multiple base directories 使用不同的配置运行应用程序的多个实例。
    2. 使用lightweightregistries进行集中配置管理
    3. 一个集中管理的配置管理数据库 (CMDB) 文件,包含每台机器的特定于主机的值,每晚都会同步到所有生产主机。应用程序使用模板化配置,并在运行时根据当前主机名从 CMDB 中进行选择。

    【讨论】:

      【解决方案2】:

      这取决于您的 J2SE 应用程序类型:

      • J2SE 可执行 JAR 文件(非常简单):使用 user.home System property 查找 home-dir。然后相应地创建一个子目录(例如 PGP、SVN、... 做)
      • Java Web Start 为安全属性提供了非常好的包含方法。始终针对用户
      • 最后是 Eclipse RCP:您有了工作空间的概念(也源自 user.home),用于用户和配置(不完全确定如何在 Vista 中访问这个棘手的问题)以供计算机广泛使用

      所有这些方法在谨慎使用时——使用正确的separatorChar——与操作系统无关。

      【讨论】:

        【解决方案3】:

        Java 在java.util.prefs.Preferences 中有一个专门用于执行此操作的库。

        Preferences userPrefs = Preferences.getUserNodeForPackage(MyClass.class); // Gets user preferences node for MyClass
        Preferences systemPrefs = Preferences.getSysteNodeForPackage(MyClass.class); // Gets system preferences node for MyClass
        Preferences userPrefsRoot = Preferences.getUserRoot(); // Gets user preferences root node
        Preferences systemPrefsRoot = Preferences.getSystemRoot(); // Gets system preferences root node
        

        【讨论】:

          【解决方案4】:

          你可能想看看Resource Bundles

          【讨论】:

            【解决方案5】:

            对于用户特定的配置,您可以将配置文件写入“user.home”系统属性指向的文件夹。当然只能在那台机器上工作。

            【讨论】:

              【解决方案6】:

              我用这个

              字符串路径文件 = null; 如果(操作系统。包含(“赢”)){ pathFile = System.getenv("AppData"); }别的{ pathFile = System.getProperty("user.home"); }

              我在这里保存我的应用程序的设置 Windows 上的 C:\Users\USERNAME\AppData\ 其他平台上的 user.home (/home/USERNAME)

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2023-01-12
                • 2012-08-17
                • 2012-06-04
                • 2012-05-30
                • 2015-11-16
                • 2015-06-29
                • 1970-01-01
                • 2011-05-29
                相关资源
                最近更新 更多