在Java中存储应用程序的conf数据的正确方法是什么?

时间:2008-10-11 17:29:39

标签: java configuration

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

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

如何以与平台无关的方式在文件系统中获取这些位置?

感谢您的建议!

6 个答案:

答案 0 :(得分:25)

首先是格式:

  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上,即注册表(您可以在 HKLM HKCU 下选择 / Software / JavaSoft / Prefs )。在Unix下,相同的API在用户主页或 / etc 下创建文件。每个prefs配置单元都可以作为XML文件导出和导入。您可以通过将“java.util.prefs.PreferencesFactory”JVM属性设置为实现类名来指定PreferencesFactory接口的自定义实现。
  5. 通常,根据您的应用场景,使用prefs API可能是好事还是坏事。

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

      1. 将大部分XML文件打包在应用程序的JAR中,位于根目录或/ META-INF目录下。这些文件将是只读的,并被视为应用程序的私有。
      2. 将用户可修改的配置放在 $ APP_HOME / conf 下。它应该主要由属性文件组成,偶尔也应该包含一个简单的XML文件(XStream序列化)。这些文件是作为安装过程的一部分进行调整的,通常不是用户可以使用的。
      3. 在user-home下,在点目录(即'〜/ .myapplication')中存储任何用户配置。用户配置可能会覆盖应用程序 conf 目录中的配置。从应用程序中进行的任何更改都会在此处(另请参阅下一点)。
      4. 您还可以使用 $ APP_HOME / var 目录来存储特定于此应用程序实例的任何其他可变数据(而不是用户)。这种方法的另一个优点是,您可以通过简单复制一个目录来移动和备份整个应用程序及其配置。
      5. 这说明了一些管理配置的标准技术。您可以使用不同的库和工具来实现它们,从原始JRE开始,添加Spring / Guice或者获取完整的J2EE容器(可能使用嵌入式Spring)

        管理配置的其他方法是:

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

答案 1 :(得分:13)

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

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

所有这些方法在小心使用时都使用正确的separatorChar - 操作系统中立。

答案 2 :(得分:5)

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

答案 3 :(得分:1)

您可能需要查看Resource Bundles

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我用这个


    String pathFile = null;
    if(OS.contains("win")){
        pathFile = System.getenv("AppData");
    }else{
        pathFile = System.getProperty("user.home");
    }

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