У меня есть проект, который использует конфигурацию TypeSafe. Он загружает несколько файлов конфигурации. Один загружается простым способом:
private val config = ConfigFactory.load( "test-parameters" )
Этот, кажется, соблюдает синтаксис переопределения foo = ${?ENV_VAR}
, независимо от того, передается ли ENV_VAR через среду или через свойства системы Java (-DXXX=).
Другие файлы конфигурации загружаются с использованием .parseResources()
, за которым в конечном итоге следует .resolve()
. Синтаксис переопределения работает нормально, если переменные указаны как переменные среды, но ничего не происходит, когда они являются системными свойствами. Код выглядит следующим образом:
// we define a layered config, so that you can define values in one layer, and customize them in another
// if your environment includes sub-folders, config files are read from deepest folder first
// so that you can define values in the higher folders and override them in the more specific folder
// e.g. if the environment is "foo/bar/baz", then the order of loading config files is:
// * application.conf
// * conf/foo/bar/baz/config.conf
// * conf/foo/bar/config.conf
// * conf/foo/config.conf
// * default.conf
def loadConfig(env: String): Config = {
// do not allow the user to supply a relative path that tries to escape the conf directory hierarchy
if (env != null && env.matches("(?:^|/)\\.\\./"))
throw new Exception("Illegal Environment String")
var c = userConfig
if (env != null && env != "") {
val parts = env.split("/")
var n = parts.length
while (n > 0) {
c = c.withFallback(ConfigFactory.parseResources(environmentConfigFile(parts.take(n).mkString("/"))))
n -= 1
}
}
c.withFallback(defaultConfig).resolve()
}
def loadConfig: Config = loadConfig(Test.environment)
На первый взгляд, это похоже на ошибку. .parseResources().resolve()
и .load()
ведут себя немного по-разному.
Или я просто что-то пропустил?