2014-07-26 35 views
10

Ho un'applicazione Akka che utilizza più valori di configurazione (indirizzo IP, numeri di porta) definiti in resource/application.conf. Sto utilizzando il plug-in sbt-assembly per creare un jar uber e quindi implementare questo jar.Sovrascrittura di più valori di configurazione in configurazione Typesafe quando si utilizza un uberjar per distribuire

C'è un modo per ignorare l'intero file application.conf utilizzando un altro file che si trova all'esterno del jar uber? (Ad esempio, vengono utilizzati i valori nel nuovo file di configurazione)

risposta

18

Ci sono vari modi per raggiungere tale:

  1. Si sia impostato un percorso di classe per includere application.conf dalla directory esterna e apparire sul classpath prima di altri classpath voci come il tuo barattolo. Per farlo è possibile utilizzare il normale java -classpath myconfdir:theapp.jar e specificare la classe principale in modo esplicito.

  2. In alternativa è possibile includere un altro file di conf nel file con la direttiva include "application" nel proprio file conf.

  3. È possibile impostare la variabile di ambiente in application.conf che punterà a un file da includere. In seguito hai impostato env in shell.

  4. È possibile sovrascrivere i valori a livello di codice: config.withValue("hostname", ConfigValueFactory.fromAnyRef("localhost"). ActorSystem accetta un oggetto Conf o carica da conf predefinito se non fornito.

  5. Il metodo più semplice di gran lunga è quello di raccogliere solo un altro file con argomento della riga di comando -Dconfig.resource=/dev.conf java.

Per maggiori dettagli si riferiscono alla documentazione ufficiale here.

+4

Grazie per questo, Aleksey. La tua risposta mi ha indirizzato a '-Dconfig.file = ...' che è quello che cercavo. –

1

sono stato in grado di ignorare a livello di codice di configurazione Akka default 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) 
1

Lo facciamo in prod in questo modo:

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

Il file di cui sopra deve terminare con .conf. Dispone di tutte le configurazioni specifiche dell'ambiente di produzione e vive all'esterno del contenitore, quindi distribuisci un artefatto Akka identico su tutti i server. Sostituirà qualsiasi cosa in application.conf.

Poi nello script di avvio:

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