【问题标题】:Java configuration framework [closed]Java配置框架[关闭]
【发布时间】:2010-09-06 17:56:49
【问题描述】:

我正在清除 Java 库中的所有硬编码值,并且想知道哪种框架最适合处理运行时配置(就零或接近零的配置而言)?我更喜欢基于 XML 的配置文件,但这不是必需的。

请仅在您对框架有实际经验的情况下回复。我不是在寻找例子,而是在寻找经验......

【问题讨论】:

  • 过去我也为此苦苦挣扎,最后依靠 java.utils.Properties、Apache Commons 配置、Google Guava 和 Maven 创建了一个我们实际使用的接近于零的配置解决方案为旧系统配置,但只为新系统开箱即用。 Maven Central 上的最新迭代:github.com/sofdes/config-generation-maven-plugin

标签: java xml configuration frameworks configurationmanager


【解决方案1】:

Apache Commons Configuration 效果很好。它支持在后端以多种格式存储配置,包括属性、XML、JNDI 等。它易于使用和扩展。要获得最大的灵活性,请使用factory 获取配置,然后使用Configuration interface

Commons Configuration 与直接的 Properties 文件不同的两个特点是它支持自动转换为常见类型(int、float、String 数组)并支持属性替换:

server.host=myHost
server.url=http://${server.host}/somePath
【解决方案2】:

智能参数利用工具 (InPUT, page) 允许将几乎所有(硬编码)决策作为参数外部化到基于 XML 的配置文件中。已于 2012 年初启动,作为对现有配置工具在通用性和关注点分离方面的感知缺陷的回应。

InPUT 可能比大多数用例所需的功能更强大,因为它允许实验数据(输入 - 输出)的编程语言独立公式,具有诸如定义复杂描述符到类映射,或基于预定义值范围的随机配置生成和验证(用于测试和研究,例如蒙特卡洛模拟)。您可以用子参数定义参数,参数值的相对限制(数值参数a>参数b)等。

它仍处于测试阶段,但相当稳定,我将它用于我的研究、实验的配置和记录以及教学目的。一旦它可用于其他语言(管道中的 C++ 适配器),其他研究人员/从业者可以重用描述符,在 C++ 中运行相同算法的实现(使用代码映射概念)。这样,可以验证实验结果/可以更轻松地迁移程序。该文档仍在工作中,但页面上提供了几个示例。 InPUT 是开源软件。

对于那些感兴趣的人,Conceptual Research Paper

【讨论】:

    【解决方案3】:

    您可以查看新发布的tools4j-config,其使命是让您在运行时轻松处理配置。

    【讨论】:

      【解决方案4】:

      这里有多种选择:

      您可能想阅读Comparison of Commons Configuration With JFig and JConfigConfiguring your Applications using JFig 以获得来自不同用户的一些反馈。

      就我个人而言,我使用过 jConfig,这是一次很好的体验。

      【讨论】:

        【解决方案5】:

        我刚刚发布了一些关于使用 Spring 的 ClassPathResource 作为 IoC 替代方案的 code 的简短说明。 ClassPathResource 允许您将属性文件放置在类路径上的任何位置(例如,全部放在一个位置,或者作为它们配置的代码的对等点。我的示例仅使用 java.util.Properties,因此您可以使用纯文本“name=value”样式或其 XML 格式。

        【讨论】:

          【解决方案6】:

          请查看此网址: http://issues.apache.org/jira/browse/CONFIGURATION-394

          我们正在寻找的配置框架是 Apache Commons Configuration 之上的东西,并且必须支持并发问题、JMX 问题和大多数存储(例如 .properties 文件、.xml 文件或 PreferencesAPI)。

          weblogic 团队在“管理控制台”上提供的内容很有趣,通过它您可以对配置进行事务性(原子)更新,以便通知已注册的侦听器。

          Apache 家伙坚持认为这个项目超出了 Commons Configuration 的范围,也许吧!

          我附上了一个简单的配置框架,请看一下。

          【讨论】:

            【解决方案7】:

            你可以试试YamlBeans。这样你就可以编写任何你想保存配置数据的类,然后你可以自动在 YAML 中写入和读取它们。

            YAML 是一种人类可读的数据格式。它比 java.util.Properties 具有更强的表现力。您可以拥有列表、地图、锚点、类型数据等。

            【讨论】:

              【解决方案8】:

              关于使用 java.util.Properties 的建议 - 从 jdk 1.5 开始,Preferences API (java.util.prefs) 似乎是使用 Properties API 的首选替代方案。

              原因:增加的可扩展性、后端中立性等。

              【讨论】:

              • 我使用了 Preferences 有一段时间了,但是在 Windows Vista 中太痛苦了,我现在正在寻找其他东西......
              • Preferences API 非常糟糕。此外,由于某些权限问题,我已经看到它在 Linux 上完全失败。除此之外,Preferences 不能替换 Properties,因为它将配置移动到一个中心位置。如果您希望在同一台计算机上运行多个程序实例,这会影响您。例如,Preferences 不是存储 WAR 配置的好地方。
              【解决方案9】:

              属性文件非常简单,如果您需要更多功能,您可以将一些配置文件格式化为 Java 类。这些可以放在不同的包/模块中,并且可以在运行时使用 BeanShell 之类的库进行预编译或加载。

              注意:在最简单的情况下(预编译),您不需要任何额外的库。

              【讨论】:

                【解决方案10】:

                如果你想做一些高级的(和类型安全的),你可能想看看这个:http://www.ibm.com/developerworks/java/library/j-configint/index.html

                【讨论】:

                • “高级”的意思是“自己动手”,然后:是的。但我更针对现有的框架,而不是 DIY。但无论如何都是好文章。
                【解决方案11】:

                Commons Configuration

                我们正在使用它。单独的属性文件更容易处理,但如果您需要表示更复杂的数据公共配置,也可以执行此操作并读取您的属性文件。

                如果您不做任何复杂的事情,我会坚持使用properites 文件。

                【讨论】:

                  【解决方案12】:

                  几周前我wrote 对此进行了讨论,并得出结论,XML 是最广泛使用的符号之一。

                  这是最好的吗?我不这么认为,我真的很喜欢 JSON,但是工具仍然达不到 XML,所以我想我们必须拭目以待。

                  【讨论】:

                    【解决方案13】:

                    大部分时间我倾向于使用java.util.Properties(或其他语言和框架中的类似类)wrapped in an application-specific configuration class,但我对这方面的替代方案或变体非常感兴趣。特别是如果涉及图形配置对话框或配置数据的多个视图,事情会变得有点棘手。

                    不幸的是,我对 Java 的特定库没有任何经验(除了我自己编写的库),但任何指针都将不胜感激。

                    更新

                    好的。这并不完全正确,三个是Spring Java Configuration Project

                    【讨论】:

                      【解决方案14】:

                      如果您的硬编码值只是简单的键值对,您应该查看java.util.Properties。它比 xml 简单得多,更易于使用,而且实现起来微不足道。

                      如果您正在使用 Java,并且您从磁盘存储或检索的数据被建模为键值对(听起来就像您的情况),那么我真的想不出更好的解决方案。

                      我使用属性文件在一个更大的项目中简单配置小包,并作为整个项目的更全局配置,我从来没有遇到过问题。

                      当然,这有一个巨大的好处,即不需要使用任何 3rd 方库。

                      【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2014-11-21
                      • 2012-12-25
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-04-17
                      相关资源
                      最近更新 更多