sbt.version= 0.13.1
在 build.sbt
我通过调用我的项目依赖项的一段代码来分配设置键,该代码又通过 Typesafe Config 的 ConfigFactory
进行配置。 .我的依赖项有 reference.conf
在 jar 的根目录中,我的项目本身包含一个覆盖 application.conf
在 src/main/resources
.
lib/dependency 也是我的代码,顺便说一句。
import com.mylib.Finders
import com.myproj.sbt.Keys._
projKeyColorSetting in Compile := Finders.findColor // this calls ConfigFactory.load
seq(projSettings:_*)
构建甚至没有加载,因为它找不到我尝试在我的 lib 代码中引用的第一个 conf key 。
我在我的构建文件中尝试了许多范围和类路径操作的组合,但无济于事。我假设 jar 的
reference.conf
本来在Compile
范围的类路径,但它不像我预期的那样工作。我昨天大部分时间都在研究关于 Classpath、Scopes、Keys、Tasks 和 ResourceGenerators 的 SBT 文档——我的目的是执行一个依赖于
projKeyColorSetting
的自定义插件。设置 build.sbt
如下:lazy val projSettings = inConfig(Compile) {
Seq(
resourceGenerators in Compile <+= Def.task {
val fileCreated = createColorFile(projKeyColorSetting.value)
Seq(fileCreated)
}
)
}
最佳答案
如果你从 foo.jar 获取一个类,那么 ConfigFactory.load()
应该在同一个 jar 中找到一个 reference.conf。如果没有,那么就出了问题,但很难猜出是什么。可能是reference.conf中可能有一些无效的语法;可能是 reference.conf 不在 jar 中;可能是 reference.conf 位于子目录而不是 jar 的根目录中;很难猜。我会尝试 -Dconfig.trace=loads
在那里寻找问题(它应该告诉你配置是否尝试加载reference.conf,例如)。你也可以自己做classLoader.getResources
看看你是否可以找到不涉及配置的文件。
你也可以试试ConfigFactory.parseResourcesAnySyntax("reference")
看看你的引用设置是否在那里,然后尝试调用ConfigFactory.load
直接看看你的设置是否在里面。总的来说,仔细检查所有假设,看看哪里出了问题。
至于如何添加 src/main/resources,两个基本策略是 1) 以某种方式将它放在类路径中(在这种情况下这可能很困难;您甚至在启动 sbt 之前就需要它,或者需要做一些事情自定义 ClassLoader 的乐趣)或更实用 2)使用 ConfigFactory.parseFile()
手动加载它.
我可能会捕获 resourceDirectory
键作为任务的依赖项,然后执行类似(未经测试)的操作:
myTask := {
val resourceDir = (resourceDirectory in Compile).value
val appConfig = ConfigFactory.parseFile(resourceDir / "application.conf")
val config = ConfigFactory.load(appConfig) // puts reference.conf underneath
Finders.findColor(config)
}
请注意,这涉及更改 findColor 以获取
Config
参数,或者您可能更愿意让 Finders 成为可以使用 Config
构造的非单例;参见 https://github.com/typesafehub/config/blob/master/examples/scala/simple-lib/src/main/scala/simplelib/SimpleLib.scala#L22 中的示例我试图在使用 Config
时说明这一点通常一个库都应该默认为 ConfigFactory.load
但也有一个构造函数,允许自定义 Config
对于这样的情况。
关于scala - 使用 Typesafe Config 的 ConfigFactory 在 build.sbt 中设置关键设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22663213/