Merge 合并多个TypeSafe配置文件并仅在它们全部合并后解析

Merge 合并多个TypeSafe配置文件并仅在它们全部合并后解析,merge,typesafe-config,Merge,Typesafe Config,我正在编写测试代码来验证RESTful服务。我希望能够通过在执行测试之前简单地更改环境变量,将它指向我们的任何不同环境 我希望能够合并三个不同的配置文件: conf/env/default.conf-默认配置值 适用于所有环境 conf/env/.conf-特定于环境的 价值观 application.conf-用户对任何 在上面 我的想法是,我不想把所有内容都放在一个配置文件中,并冒着错误编辑导致配置项丢失的风险。因此,应该将它们分开,并让用户能够覆盖它们 这里是它变得棘手的地方:defa

我正在编写测试代码来验证RESTful服务。我希望能够通过在执行测试之前简单地更改环境变量,将它指向我们的任何不同环境

我希望能够合并三个不同的配置文件:

  • conf/env/default.conf
    -默认配置值 适用于所有环境
  • conf/env/.conf
    -特定于环境的 价值观
  • application.conf
    -用户对任何 在上面
我的想法是,我不想把所有内容都放在一个配置文件中,并冒着错误编辑导致配置项丢失的风险。因此,应该将它们分开,并让用户能够覆盖它们

这里是它变得棘手的地方:
default.conf
将包括${references}指向在
.conf
中要重写的内容,并且可能在
application.conf
中被进一步重写


我需要推迟解决,直到三者合并。如何做到这一点?

答案是使用
ConfigFactory.parseResource()
代替
ConfigFactory.load()

这是完成的结果

private lazy val defaultConfig     = ConfigFactory.parseResources("conf/env/default.conf")
private lazy val environmentConfig = ConfigFactory.parseResources("conf/env/" + env + ".conf" )
private lazy val userConfig        = ConfigFactory.parseResources("application.conf")
private lazy val config = ConfigFactory.load()
                          .withFallback(userConfig)
                          .withFallback(environmentConfig)
                          .withFallback(defaultConfig)
                          .resolve()

这里可能需要更清楚地说明此代码存在问题:
.resolve()
将从环境中提取值,但不会从系统属性中提取值。还不知道如何解决这个问题。找到了解决方案。编辑答案以反映它。注意:开始时使用
.load()
可能会使上述代码中不需要
userConfig
。但是原则是明确的,这是重要的部分。你应该使用
.empty()
而不是
.load()
,以确保
defaultConfig
被用作后备配置。在开始合并配置之前,我对John的答案表示赞同,并且值得参考。