我有一个sbt项目,它定义了集成测试配置。 Build.scala:
lazy val root =
Project("root", file("."))
.configs( IntegrationTest )
.settings( Defaults.itSettings : _*)
build.sbt有(除其他外):
libraryDependencies ++=Seq(
"org.scalatest" % "scala-test_2.10" % "1.0.8" % "test,it",
"com.typesafe" % "config" % "1.2.0")
现在我在reference.conf
下面有一个src/main/resources
文件:
resources {
postgresAdapter {
db = "prod"
}
}
,同样在src/it/resources
下:
resources {
postgresAdapter {
db = "integration"
}
}
我有以下课程:
class PostgresAdapter{
private val db = ConfigFactory.load.getConfig("resources").getString("postgresAdapter.db")
private def connection: Try[java.sql.Connection] = {
val _ = classOf[org.postgresql.Driver]
Try(DriverManager.getConnection(s"jdbc:postgresql://dbserver/$db", "user", "password"))
}
}
我希望db
使用prod
进行初始化,如果我执行sbt run
并使用integration
进行初始化sbt it:test
。
是否可以配置sbt和/或Typesafe配置以产生此效果,还是应该使用不同的方法?
PS:我希望避免在配置文件中使用db_prod
和db_integration
参数进行生产。
答案 0 :(得分:1)
我认为你可能有一个问题(没有在类路径上得到你的两个文件夹或者没有按正确的顺序)或者你可能有一个Typesafe配置问题(它不是在读取两个reference.conf,它们是在classpath)。
Typesafe Config指定从类路径加载两者的顺序:https://github.com/typesafehub/config/blob/master/HOCON.md#conventional-configuration-files-for-jvm-apps
您可以klass.getClassLoader().getResources("reference.conf")
查看您的两个reference.conf
出现的订单。如果您首先使用src/it/resources
,那么它应该覆盖我认为您想要的src/main/resources
那个?
如果你没有在类路径上同时拥有reference.conf
,那么你有一个问题(或者至少,你的第一个问题是sbt),你需要在类路径上获得额外的文件夹。
还有其他方法可以使用Typesafe配置来处理此问题,例如加载额外资源(如果存在,如ConfigFactory.parseResources("testing.conf")
)并覆盖设置,或者在jvm命令行上分配集成测试和设置系统属性比如-Dresources.postgresAdapter.db
...我确定还有其他创意解决方案,只取决于你想要的。
我会把它变成一个维基,如果你的问题变成了问题,尤金可能会帮你解决问题!
(如果Typesafe配置未按指定工作,请在https://github.com/typesafehub/config/issues提交错误