scala deployment sbt akka typesafe-config

scala - Anulando múltiples valores de configuración en la configuración Typesafe cuando se usa un uberjar para implementar



deployment sbt (3)

Tengo una aplicación Akka que usa múltiples valores de configuración (dirección IP, números de puerto) definidos en resource/application.conf . Estoy usando el plugin sbt-assembly para crear un jar de uber y luego implementar este jar.

¿Hay alguna manera de anular todo el archivo application.conf utilizando otro archivo que esté fuera del archivo uber? (es decir, se usan valores en el nuevo archivo conf)


Hay varias formas de lograr eso:

  1. Establece un classpath para incluir application.conf desde un directorio externo y aparece en el classpath antes de otras entradas de classpath como su jar. Para hacer eso puedes usar java -classpath myconfdir:theapp.jar y especificar la clase principal explícitamente.

  2. Alternativamente, puede incluir otro archivo conf en su archivo con la directiva include "application" en su archivo conf.

  3. Puede establecer la variable de entorno en application.conf que apuntará a un archivo para incluir. Estableces env en shell después.

  4. Puede sobrescribir los valores de forma programática: config.withValue("hostname", ConfigValueFactory.fromAnyRef("localhost") . ActorSystem toma un objeto de Conf o carga desde conf predeterminado si no se proporciona.

  5. La más fácil por el momento es simplemente elegir otro archivo con el argumento de línea de comandos de -Dconfig.resource=/dev.conf java.

Para más detalles, consulte los documentos oficiales aquí .


Pude omitir programáticamente las configuraciones de akka predeterminadas con:

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)


Lo hacemos en prod así:

#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"

El archivo anterior debe terminar en .conf . Tiene todas las configuraciones específicas del entorno de producción y vive fuera del contenedor, por lo que implementa un artefacto Akka idéntico en todos los servidores. Anulará cualquier cosa en application.conf .

Luego en el script de inicio:

java -Dconfig.file=/full/path/deploy_prod.conf -jar your.jar com.your.Main