16

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

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

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

4

6 回答 6

26

先说格式:

  1. Java属性文件适用于键/值对(也自动处理换行符)。通过使用“点符号”可以实现一定程度的结构。缺点是该结构不允许您轻松枚举顶级配置实体并以向下钻取的方式工作。最适合用于一小组通常可调整的特定于环境的设置
  2. XML 文件 - 经常用于各种 Java 框架(尤其是 J2EE 和 Spring)的更复杂的配置。我建议你至少了解一下Spring——即使你决定不使用它,它也包含许多值得了解的想法。如果您决定推出自己的 XML 配置,我建议您使用带有自定义序列化选项的XStream,或者如果您只需要解析一些 XML,请查看XOM。BTW Spring 还允许您插入自定义 XML 配置语言,但这是一项相对复杂的任务。XML 配置最适合用于最终用户看不到或无法调整的更复杂的“内部”配置。
  3. 序列化 Java 对象 - 一种快速简便的方法来保持对象的状态并在以后恢复它。如果您编写配置 GUI 并且您不关心配置是否是人类可读的,这很有用。进化类时要注意兼容性问题。
  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. 将大部分 XML 文件打包到应用程序的 JAR 中,位于根目录或 /META-INF 目录下。这些文件将是只读的,并被视为应用程序的私有文件。
  2. 将用户可修改的配置放在$APP_HOME/conf下。它应该主要由属性文件和偶尔的简单 XML 文件(XStream 序列化)组成。这些文件作为安装过程的一部分进行了调整,通常用户无法使用。
  3. 在用户主目录下,在一个点目录(即“~/.myapplication”)中存储任何用户配置。用户配置可能会覆盖应用程序conf目录中的配置。从应用程序中进行的任何更改都在这里(另请参阅下一点)。
  4. 您还可以使用$APP_HOME/var目录来存储特定于此应用程序实例(而不是用户)的任何其他可变数据。这种方法的另一个优点是您可以通过一个目录的简单副本来移动和备份整个应用程序及其配置。

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

其他管理配置的方法是:

  1. 使用多个基本目录来运行使用不同配置的应用程序的多个实例。
  2. 使用轻量级 注册表进行集中配置管理
  3. 一个集中管理的配置管理数据库 (CMDB) 文件,包含每台机器的特定于主机的值,每晚都会同步到所有生产主机。应用程序使用模板化配置,并在运行时根据当前主机名从 CMDB 中进行选择。
于 2008-10-11T19:33:52.123 回答
14

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

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

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

于 2008-10-11T17:44:09.520 回答
6

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
于 2008-10-11T17:46:45.523 回答
1

您可能想查看Resource Bundles

于 2008-10-11T17:36:40.440 回答
0

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

于 2008-10-11T17:43:29.273 回答
0

我用这个

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

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

于 2015-07-25T08:56:16.533 回答