我是一个使用resource/application.conf
中定义的多个配置值(IP地址,端口号)的Akka应用程序。我使用sbt-assembly
插件创建了一个超级jar,然后部署了这个jar。
有没有办法通过使用uber jar之外的另一个文件来覆盖整个application.conf
文件? (即,使用新conf文件中的值)
答案 0 :(得分:25)
有多种方法可以实现这一目标:
您可以设置一个类路径以包含来自外部目录的application.conf
,并在其他类路径条目(如jar)之前显示在类路径中。为此,您可以使用常规java -classpath myconfdir:theapp.jar
并明确指定主类。
您也可以在conf文件中使用include "application"
指令将另一个conf文件包含到您的文件中。
您可以在application.conf
中设置环境变量,该变量将指向要包含的文件。之后你在shell中设置了env。
您可以通过编程方式覆盖值:config.withValue("hostname", ConfigValueFactory.fromAnyRef("localhost")
。 ActorSystem
接受Conf对象或从默认conf加载(如果未提供)。
最简单的是使用-Dconfig.resource=/dev.conf
java命令行参数选择另一个文件。
有关详细信息,请参阅官方文档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)