Переопределение нескольких значений конфигурации в конфигурациях Typafe при использовании uberjar для развертывания
У меня есть приложение Akka, которое использует несколько значений конфигурации (IP-адрес, номера портов), определенные в resource/application.conf
. Я использую плагин sbt-assembly
для создания банки uber, а затем развертывания этой банки.
Есть ли способ переопределить весь файл application.conf
, используя другой файл, который находится за пределами uber jar? (т.е. используются значения в новом файле conf)
Ответы
Ответ 1
Существуют различные способы достижения этого:
-
Вы либо устанавливаете classpath для включения application.conf
из внешнего каталога, либо должны появляться в пути к классам перед другими элементами pathpath, такими как ваша банка. Для этого вы можете использовать обычный java -classpath myconfdir:theapp.jar
и явно указывать основной класс.
-
Вы можете альтернативно включить другой файл conf в свой файл с директивой include "application"
в вашем файле conf.
-
Вы можете установить переменную среды в application.conf
, которая укажет на файл, который будет включен. После этого вы устанавливаете env в оболочке.
-
Вы можете переопределить значения программно: config.withValue("hostname", ConfigValueFactory.fromAnyRef("localhost")
. ActorSystem
принимает объект Conf или загружает из conf conf по умолчанию, если не указан.
-
Самый простой - просто выбрать другой файл с аргументом командной строки -Dconfig.resource=/dev.conf
java.
Подробнее см. официальные документы здесь.
Ответ 2
Я смог программно переопределить конфигурацию по умолчанию akka с помощью:
val customConf =
ConfigFactory.parseString(s"""
akka {
persistence.snapshot-store.local{
dir = target/snapshot
}
persistence.journal.leveldb.dir = target/journal
}
""")
val config = customConf.withFallback(original).resolve()
logger.info(config.root().render())
val system = ActorSystem("iSystem", config)
Ответ 3
Мы делаем это в prod так:
#deploy_prod.conf
include "application"
akka.remote.hostname = "prod.blah.com"
# Example of passing in S3 keys
s3.awsAccessKeyId="YOUR_KEY"
s3.awsSecretAccessKey="YOUR_SECRET_KEY"
Вышеупомянутый файл должен заканчиваться на .conf
. Он имеет все конфигурационные файлы, специфичные для производственной среды, и живет снаружи, поэтому вы развертываете идентичный артефакт Akka на всех серверах. Он будет переопределять что-либо в application.conf
.
Затем в старте script:
java -Dconfig.file=/full/path/deploy_prod.conf -jar your.jar com.your.Main