Переопределение нескольких значений конфигурации в конфигурациях 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