如何在运行sbt时传递不同的配置文件?

时间:2016-08-06 15:07:23

标签: scala sbt akka

在sbt中,是否可以传递不同的配置文件?

sbt run

那将使用默认配置文件application.conf

我希望能够在开发期间在不同的配置文件之间切换,如何在sbt内部将其作为参数传递。

2 个答案:

答案 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")
}
  • 传递文件路径使用-D执行配置文件,例如config.path=...
  • 加载配置时,需要执行以下操作:检查是否提供了指定文件路径的运行时参数,检查文件是否存在,然后加载该文件。

更新:选项3:使用config.resource

如果您需要加载完全独立的配置文件,可以使用-Dconfig.resource=filepath覆盖整个配置文件。

选项4

您还可以使用环境变量覆盖配置选项的特定值。它看起来像这样:

database {
  host = "localhost"
  host = ${?DATABASE_HOST}
}

这意味着如果设置了DATABASE_HOST env变量,其值将用于覆盖该键已经存在的application.conf

答案 1 :(得分:0)

也可以使用-Dresources中添加外部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