Javaconfiguration框架
我正在清除Java库中的所有硬编码值,并且想知道什么框架可以处理运行时configuration(在零configuration或接近零的configuration方面)是最好的? 我更喜欢基于XML的configuration文件,但这不是必需的。
如果你有一个框架的实际经验,请只回复。 我不是在寻找例子,而是经验…
如果你的硬编码值只是简单的键值对,你应该看看java.util.Properties 。 这比xml简单很多,使用起来更简单,而且实现起来也很麻烦。
如果您正在使用Java,并且您正在存储或从磁盘检索的数据被build模为键值对(这听起来像是您的情况),那么我真的无法想象一个更好的解决scheme。
我已经使用属性文件在较大的项目中对小包进行简单的configuration,并且作为整个项目的更全局的configuration,我从来没有遇到过问题。
当然这具有不需要任何第三方库利用的巨大好处。
Apache Commonsconfiguration很好。 它支持在后端以各种格式存储configuration,包括属性,XML,JNDI等等。 它很容易使用和扩展。 为了获得最大的灵活性,使用工厂来获得configuration,然后使用configuration界面 。
Commons Configuration的两个特性区别于直属属性文件,它支持自动转换为常见types(int,float,String数组),它支持属性replace:
server.host=myHost server.url=http://${server.host}/somePath
这里有各种select:
- java.util.Properties
- java.util.prefs.Preferences(自Java 5以来)
- Commonsconfiguration
- jConfig
- JFig
- Carbon的configuration服务
您可能需要阅读JFig和JConfig的Commons Configuration比较以及使用JFig configuration您的应用程序,以获取来自不同用户的一些反馈。
我个人使用jConfig,这是一个很好的经验。
Commonsconfiguration
我们正在使用这个。 单独的属性文件更容易处理,但是如果您需要表示更复杂的数据公共configuration,则可以执行此操作并读取属性文件。
如果你没有做任何复杂的事情,我会坚持合适的文件。
如果你想做一些先进的(和types安全的),你可能想看看这个: http : //www.ibm.com/developerworks/java/library/j-configint/index.html
智能参数利用工具(InPUT, 页面 )允许将几乎任何(硬编码)决定作为参数外部化到基于XML的configuration文件中。 它已于2012年初启动,作为对现有configuration工具在普遍性和关注点分离方面的认识不足的回应。
InPUT可能比大多数用例需要的function更强大,因为它允许编程语言独立地制定实验数据(input – 输出),具有诸如复杂描述符到类映射的定义,或随机configuration产卵和基于预定义的值范围(用于testing和研究,例如蒙特卡罗模拟)。 您可以使用子参数定义参数,参数值的相对限制(数字参数a>参数b)等。
它仍然处于testing阶段,但相当稳定,我将其用于我的研究, 实验的configuration和logging以及教学目的 。 一旦它可用于其他语言(pipe道中的C ++适配器),其他研究人员/从业者可以重复使用C ++中运行相同algorithm的描述符(使用代码映射概念)。 这样, 实验结果可以validation/程序可以更容易地迁移 。 文档仍处于工作过程中,但在页面上有几个示例 。 InPUT是开源软件。
对于那些感兴趣的, 概念性研究报告 。
我倾向于在大多数情况下使用java.util.Properties
(或其他语言和框架中的类似类) 封装在特定于应用程序的configuration类中,但是我非常感兴趣的是替代scheme或变体。 特别是因为如果涉及configuration数据的graphics化configuration对话框或多个视图,事情会变得有点棘手。
不幸的是,我没有任何与Java特定的库(除了我自己写的)的经验,但任何指针将不胜感激。
更新
好。 这不完全正确,三是Spring Javaconfiguration项目 。
几个星期前我写了这篇文章,得出的结论是XML是使用最广泛的符号之一。
这是最好的吗? 我不这么认为,我真的很喜欢JSON,但是这个工具还没有达到XML的标准,所以我想我们必须拭目以待。
你可以试试YamlBeans 。 这样你就可以编写任何你想要保存configuration数据的类,然后你就可以自动地从YAML写入和读取它们。
YAML是一种人类可读的数据格式。 它比java.util.Properties更有performance力。 你可以有列表,地图,锚点,input数据等
请看这个url: http : //issues.apache.org/jira/browse/CONFIGURATION-394
我们正在寻找它的configuration框架是在Apache Commonsconfiguration之上,并且必须支持并发问题,JMX问题和大多数商店(例如.properties文件,.xml文件或者PreferencesAPI)。
weblogic团队在“pipe理控制台”上提供的是通过它可以对configuration进行交易(primefaces)更新,以便通知注册的监听者。
Apache的人坚持说这个项目已经超出了Commons Configuration的范围,也许吧!
我附上了一个简单的configuration框架,请看看。
我刚刚发布了一些关于使用Spring的ClassPathResource作为IoC的替代方法的代码 。 ClassPathResource允许你在类path的任何地方放置属性文件(例如,在一个地方,或者作为它们configuration的代码的同行),我的例子只是使用java.util.Properties,所以你可以使用纯文本的“name = value”风格或其XML格式。
属性文件非常简单,如果你需要更多的function,你可以将一些configuration文件格式化为Java类。 这些可以放在不同的包/模块中,可以在运行时使用BeanShell等库进行预编译或加载。
注意:在最简单的情况下(预编译),你不需要任何额外的库。
关于使用java.util.Properties的build议 – 从jdk 1.5开始,Preferences API(java.util.prefs)似乎是使用Properties API的首选替代方法。
理由:增加可扩展性,后端中立等。
你可以看看新发布的tools4j-config,它的使命是让你在运行时轻松处理configuration。