如何使用ConfigFactory加载多个conf配置文件并完成配置合并
多配置文件合并加载实现方案
你使用的是Typesafe Config库,该库原生支持同路径对象的递归合并逻辑,不需要手动做字段拼接,只要按正确规则加载合并即可得到你期望的嵌套结构。
核心实现代码
import java.io.File import com.typesafe.config.ConfigFactory // 定义所有需要加载的配置文件路径 val confFilePaths = List( new File("/your/path/to/product1.conf"), new File("/your/path/to/product2.conf") ) // 逐个解析配置文件,注意:解析阶段不要提前调用resolve() val parsedConfigList = confFilePaths.map(file => ConfigFactory.parseFile(file)) // 递归合并所有配置:withFallback会自动对同路径的对象做递归合并,而非整个覆盖 // 注意合并顺序:列表中越靠前的配置优先级越高,同路径非对象字段会优先取靠前配置的值 val mergedRawConfig = parsedConfigList.reduce((highPriority, lowPriority) => highPriority.withFallback(lowPriority) ) // 所有配置合并完成后,统一解析占位符,再按需加载默认配置(系统参数、环境变量、classpath下默认配置) // 如果不需要加载默认配置,可以直接写 val resolvedConfig = mergedRawConfig.resolve() val resolvedConfig = ConfigFactory.load(mergedRawConfig.resolve()) // 和原有逻辑对齐,和传入的args配置做最终合并 val finalConfig = args.withFallback(resolvedConfig)
关键注意事项
- 不要在单个文件解析后立刻调用
resolve():如果配置中存在跨文件的占位符引用,提前解析会直接抛出找不到引用的错误,必须等所有配置合并完成后再统一做占位符解析。 - 合并顺序可按需调整:如果你希望后加载的配置优先级更高,只需要调整reduce逻辑即可,示例代码如下:
// 列表越靠后的配置优先级越高 val mergedRawConfig = parsedConfigList.reduceRight((lowPriority, highPriority) => highPriority.withFallback(lowPriority) ) - 你给出的两个示例配置中,
data.key1.some-field字段值完全一致,合并时不会产生冲突,最终会自动保留product1、product2两个子节点,和你期望的目标结构完全一致。 - 如果你的配置文件存放在classpath下,也可以直接用
ConfigFactory.parseResources("product1.conf")替代parseFile,不需要写绝对路径。
内容的提问来源于stack exchange,提问作者Golokesh Patra
相关产品推荐
相关产品推荐

