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