scala - 使用 Typesafe Config 的 ConfigFactory 在 build.sbt 中设置关键设置?

标签 scala sbt

sbt.version= 0.13.1

build.sbt我通过调用我的项目依赖项的一段代码来分配设置键,该代码又通过 Typesafe Config 的 ConfigFactory 进行配置。 .我的依赖项有 reference.conf在 jar 的根目录中,我的项目本身包含一个覆盖 application.confsrc/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/

相关文章:

Scala案例类私有(private)构造函数不是私有(private)的

scala - 自动 Spark RDD 分区缓存驱逐何时实现?

scala - Intellij : Not a valid project ID:

eclipse - scala sbt 缓存 x eclipse 构建路径

scala - 在SBT中进行交叉构建时设置唯一的快照版本

scala - 为什么 Scala 中有 RichInt 或 RichX?

Scala Quasiquote 提升

scala - 如何发现未追踪的 future ?

scala - Apache Spark : local[K] master URL - job gets stuck

java - Intellij 不尊重 build.sbt 中的某些选项