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:
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 usarjava -classpath myconfdir:theapp.jar
y especificar la clase principal explícitamente.Alternativamente, puede incluir otro archivo conf en su archivo con la directiva
include "application"
en su archivo conf.Puede establecer la variable de entorno en
application.conf
que apuntará a un archivo para incluir. Estableces env en shell después.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.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