在sbt中,是否可以传递不同的配置文件?
sbt run
那将使用默认配置文件application.conf
我希望能够在开发期间在不同的配置文件之间切换,如何在sbt内部将其作为参数传递。
答案 0 :(得分:2)
您可以使用-D
标志覆盖配置文件中所需的任何特定属性。从版本1.0.1 afaik开始提供此功能。例如:
sbt run -D akka.cluster.seed-nodes=["akka.tcp://TestApp@host1:2552", "akka.tcp://TestApp@host2:2552"]
这将取代application.conf
适用的任何值:
akka {
cluster {
seed-nodes = ["", "", /// etc]
}
}
或者,如果要覆盖整个配置,请执行以下操作:
val runtimeMxBean = ManagementFactory.getRuntimeMXBean
val arguments = runtimeMxBean.getInputArguments.asScala.toList
val config = arguments.find(_.contains("config.path")) match {
case Some(value) => {
val opt = value.split("=")
if (Files.exists(opt.last)) {
ConfigFactory.load(opt.last)
} else {
ConfigFactory.load("application.conf")
}
case None => ConfigFactory.load("application.conf")
}
config.path=...
。更新:选项3:使用config.resource
如果您需要加载完全独立的配置文件,可以使用-Dconfig.resource=filepath
覆盖整个配置文件。
选项4
您还可以使用环境变量覆盖配置选项的特定值。它看起来像这样:
database {
host = "localhost"
host = ${?DATABASE_HOST}
}
这意味着如果设置了DATABASE_HOST
env变量,其值将用于覆盖该键已经存在的application.conf
。
答案 1 :(得分:0)
也可以使用-D
在resources
中添加外部sbt
文件夹,例如(添加到 build.sbt ,如果使用模块,则应该是也添加到模块中):
val myResourceDirectory = Option(System.getProperty("myResourceDirectory")).getOrElse("hello_world")
unmanagedResourceDirectories in Compile += baseDirectory.value / myResourceDirectory
将特定myResourceDirectory
添加到unmanagedResourceDirectories
,因此用法可能如下:
sbt -DmyResourceDirectory=myfolder/local //local
sbt -DmyResourceDirectory=myfolder/dev //dev
sbt -DmyResourceDirectory=myfolder/prod //prod