处理复杂配置有哪些可能的轻量级Java配置库?

20
我需要处理一个相对复杂的Java应用程序配置参数集合。需求大概如下:
  • 嵌套配置值包括列表、映射等,而不仅仅是简单的键/值对。
  • 多个配置文件,后面的配置文件可以智能地覆盖之前配置文件中的设置。
  • 相同的已配置项可以从不同的地方进行多次引用。
  • 可继承的配置对象,这样新对象就可以从之前的对象复制配置并只更改特定内容。
  • 新配置选项所需的代码极少——最理想的情况是将@Configurable注解添加到字段或类似的东西中。
我知道Spring在某种程度上可以实现所有这些要求。然而,它也有一些缺点,尽管没有致命的问题:
  • Spring并没有真正优化成一种配置语言,它更关注于依赖注入。
  • XML配置文件更适合打包进JAR文件中,而不是由最终用户修改,其中所有可配置属性都通过单独的属性文件或类似方式引用——而我需要的是完整的配置文件,并且容易被最终用户修改。
  • 当在线配置更新时需要终止当前连接,以及可能需要验证配置的单独配置检查原语,但实际上不执行任何操作时,Spring配置有些繁琐。
因此,我想问一下,你能否想到任何其他的替代方案,满足我的要求呢?
我有点喜欢YamlBeans,但它缺少一些功能。
5个回答

18

1
距离这个评论已经过去了6年。但我仍然想写:实际上,OWNER是一个非常有趣的选择:仍然得到支持 - 最后版本:2020年6月;完美且外观非常好的文档;轻量级 - 单个JAR文件<100 Kb;提供长列表的开箱即用功能;易于扩展 - 您可以编写自己的加载器(并从任何来源获取属性),转换器(并以任何方式将属性转换为任何类型)。 - Gmugra

12

我已经尝试过了,但是它并没有满足要求。现在,我再仔细阅读一下,发现它确实支持许多功能 - 但我仍然不确定它是否满足要求,所以我需要重新阅读文档。 - Nakedible
再次阅读文档后:不要多次引用同一配置对象,也不要继承配置(除非在 Apache Commons Configuration 的基础上自己实现)。 - Nakedible
4
此外,Apache Commons Configuration 有很多运行时依赖项,它并不是轻量级的。 - wmarbut

7
我们在项目中使用Constretto。它非常轻量级且易于使用。

看起来不错 - 除了似乎没有满足所列出的要求,即对象引用和“继承”。 - Nakedible

5
您可以尝试使用cfg4j。它主要面向分布式应用程序,但支持大多数请求的功能。

似乎它已经不再维护了。 - wonsuc

2
对于大多数需求,我已经能够使用标准属性来完成。我将一个Properties对象封装在一个配置类中,该类从以下位置读取属性文件:
  1. 公共jar包
  2. "应用程序" jar / classpath
  3. 文件系统(作为JVM的-D属性指定)
Configuration类的代码是这样的,应用程序中的属性会覆盖公共属性,文件系统属性会覆盖应用程序级别的属性。
Configuration作为Spring bean加载,并将其内部Properties对象暴露给PropertyPlaceholderConfigurer,以允许在Spring xml文件中进行进一步的$var替换。由于配置是Spring bean,因此可以在需要它的任何地方注入它。
类似这样的东西应该可以扩展到处理JSON或YAML文件,而不是属性文件,以允许映射、列表等。

此外,以下是一些将JSON属性集成到Spring配置文件中的示例代码:http://christopherhunt-software.blogspot.com/2010/04/spring-propertyeditor-for-json-map-and.html - AngerClown
这是一个相当基本的设置。然而,我的问题要求中明确列出了几个未能实现的事项。这个项目的配置需求实际上足够复杂,需要它 - 当前的配置已经超过5000行了。 - Nakedible

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接