是否有类似于 C++ 的 libconfig 的 Java 库,其中配置文件以类似 JSON 的格式存储,可以由人类编辑,然后从程序中读取?
我不想使用 Spring 或任何更大的框架。我正在寻找的是一个小型、快速、独立的库。我看了看java.util.Properties
,但它似乎不支持分层/嵌套配置数据。
是否有类似于 C++ 的 libconfig 的 Java 库,其中配置文件以类似 JSON 的格式存储,可以由人类编辑,然后从程序中读取?
我不想使用 Spring 或任何更大的框架。我正在寻找的是一个小型、快速、独立的库。我看了看java.util.Properties
,但它似乎不支持分层/嵌套配置数据。
我认为https://github.com/typesafehub/config正是您正在寻找的。该格式称为HOCON for Human-Optimized Config Object Notation ,它是JSON的超集。
HOCON也是有效的JSON:
{
"foo" : {
"bar" : 10,
"baz" : 12
}
}
HOCON 还支持标准属性格式,因此以下内容也是有效的:
foo.bar=10
foo.baz=12
我发现非常有用的功能之一是继承,它允许您对配置进行分层。例如,一个库将有一个reference.conf
,而使用该库的应用程序将有一个application.conf
. 中的设置application.conf
将覆盖 中的默认设置reference.conf
。
加载配置的标准行为:
便捷方法 ConfigFactory.load() 加载以下内容(首先列出的优先级较高):
- 系统属性 application.conf(类路径上具有此名称的所有资源)
- application.json (类路径上具有此名称的所有资源)
- application.properties(类路径上具有此名称的所有资源)
- reference.conf(类路径上具有此名称的所有资源)
我找到了这个HOCON示例:
my.organization {
project {
name = "DeathStar"
description = ${my.organization.project.name} "is a tool to take control over whole world. By world I mean couch, computer and fridge ;)"
}
team {
members = [
"Aneta"
"Kamil"
"Lukasz"
"Marcin"
]
}
}
my.organization.team.avgAge = 26
读取值:
val config = ConfigFactory.load()
config.getString("my.organization.project.name") // => DeathStar
config.getString("my.organization.project.description") // => DeathStar is a tool to take control over whole world. By world I mean couch, computer and fridge ;)
config.getInt("my.organization.team.avgAge") // => 26
config.getStringList("my.organization.team.members") // => [Aneta, Kamil, Lukasz, Marcin]
Apache Commons Configuration API和Constretto似乎有点流行并且支持多种格式(虽然没有提到 JSON)。我个人也从未尝试过,所以YMMV。