使用uberjar进行部署时,在Typesafe配置中覆盖多个配置值

时间:2014-07-26 01:26:56

标签: scala deployment sbt akka typesafe-config

我是一个使用resource/application.conf中定义的多个配置值(IP地址,端口号)的Akka应用程序。我使用sbt-assembly插件创建了一个超级jar,然后部署了这个jar。

有没有办法通过使用uber jar之外的另一个文件来覆盖整个application.conf文件? (即,使用新conf文件中的值)

3 个答案:

答案 0 :(得分:25)

有多种方法可以实现这一目标:

  1. 您可以设置一个类路径以包含来自外部目录的application.conf,并在其他类路径条目(如jar)之前显示在类路径中。为此,您可以使用常规java -classpath myconfdir:theapp.jar并明确指定主类。

  2. 您也可以在conf文件中使用include "application"指令将另一个conf文件包含到您的文件中。

  3. 您可以在application.conf中设置环境变量,该变量将指向要包含的文件。之后你在shell中设置了env。

  4. 您可以通过编程方式覆盖值:config.withValue("hostname", ConfigValueFactory.fromAnyRef("localhost")ActorSystem接受Conf对象或从默认conf加载(如果未提供)。

  5. 最简单的是使用-Dconfig.resource=/dev.conf java命令行参数选择另一个文件。

  6. 有关详细信息,请参阅官方文档here

答案 1 :(得分:4)

我们这样做就是这样:

#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结尾。它具有所有特定于生产环境的配置,并且生活在外部 jar,因此您将相同的Akka工件部署到所有服务器。它将覆盖application.conf中的任何内容。

然后在启动脚本中:

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

答案 2 :(得分: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)