Java配置框架


75

我正在淘汰Java库中的所有硬编码值,并且想知道哪种框架最好(就零或接近零的配置而言)来处理运行时配置?我希望使用基于XML的配置文件,但这不是必需的。

如果您有框架方面的实践经验,请仅作答复。我不是在寻找例子,而是经验……


过去,我也一直为此而苦苦挣扎,最终依靠java.utils.Properties,Apache Commons配置,Google Guava和Maven来创建一个接近于零的配置解决方案,我们实际上是为旧系统配置的,但只用完了新包装盒。关于Maven Central的最新迭代: github.com/sofdes/config-generation-maven-plugin
user1016765

Answers:


29

如果您的硬编码值只是简单的键值对,则应查看java.util.Properties。它比xml简单得多,易于使用,并且实现起来很麻烦。

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

我已经使用属性文件来对较大项目中的小程序包进行简单配置,并且对整个项目进行了更全局的配置,而我从来没有遇到过问题。

当然,这具有不需要任何第三方库就可以使用的巨大好处。


2
正如您所说,虽然“属性”在大多数情况下都很简单,但加载情况却并非如此。查看javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html
James McMahon 2009年

4
+1对于属性,如果只需要键/值对。一旦开始需要列表或地图,就该转向其他解决方案了。
NateS

我更喜欢@John的答案-即使您确实使用属性,拥有一些框架也很重要,这样您以后就可以切换基础实现而无需重写所有代码。stackoverflow.com/questions/25765/java-configuration-framework/...
ripper234

42

Apache Commons Configuration很好用。它支持将配置以各种格式存储在后端,包括属性,XML,JNDI等。它易于使用和扩展。为了获得最大的灵活性,请使用工厂来获取配置,然后再使用Configuration接口

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

server.host=myHost
server.url=http://${server.host}/somePath



6

共用配置

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

如果您没有做任何复杂的事情,我会坚持使用属性文件。



5

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

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

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

对于那些感兴趣的人,概念研究论文


3

大多数时候,我倾向于使用包装在特定于应用程序的配置类中的java.util.Properties(或其他语言和框架中的类似类),但是我对此的替代方案或变体非常感兴趣。特别是如果涉及图形配置对话框或有关配置数据的多个视图,事情可能会变得有些棘手。

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

更新资料

好。并非完全如此,其中三个是Spring Java Configuration Project


2

几周前,我了这篇文章,得出的结论是XML是使用最广泛的表示法之一。

最好吗?我不这么认为,我真的很喜欢JSON,但是该工具仍然无法使用XML,因此我想我们必须拭目以待。


1

您可以尝试YamlBeans。这样,您可以编写任何想要保存配置数据的类,然后可以自动在YAML中读写数据。

YAML是一种人类可读的数据格式。它比java.util.Properties具有更多的表达能力。您可以具有列表,地图,锚点,键入的数据等。


1

请查看以下URL:http : //issues.apache.org/jira/browse/CONFIGURATION-394

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

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

Apache的人坚持认为,这个项目可能不在Commons Configuration的范围之内!

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


1

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


0

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

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


0

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

原因:增加了可伸缩性,后端中立性等。


我使用偏好设置已有一段时间,但是在Windows Vista中却是如此痛苦,我现在正在寻找其他东西……
dave4351 2009年

偏好设置API非常糟糕。另外,由于某些权限问题,我已经看到它在Linux上完全失败。除此之外,“首选项”不能代替“属性”,因为它会将配置移动到中央位置。如果要在同一台计算机上运行多个程序实例,这会对您产生影响。例如,首选项不是存储WAR配置的好地方。
NateS

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.