I am writing test code to validate a RESTful service. I want to be able to point it at any of our different environments by simply changing an environment variable before executing the tests.
I want to be able to merge three different config files:
conf/env/default.conf
- the default configuration values for all environmentsconf/env/<env>.conf
- the environment-specific values application.conf
- the user's overrides of any of the aboveThe idea is that I don't want everything in a single config file, and run the risk of a bad edit causing configuration items to get lost. So instead, keep them separate and give the user the ability to override them.
Here's where it gets tricky: default.conf
will include ${references} to things that are meant to be overridden in <env>.conf
, and may be further overridden in application.conf
.
I need to postpone resolving until all three are merged. How do I do that?
The answer is to use ConfigFactory.parseResource()
in place of ConfigFactory.load()
.
Here is the finished result
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()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With