Sbt 播放2.1 ConfigFactory.parseFile在替换时失败

Sbt 播放2.1 ConfigFactory.parseFile在替换时失败,sbt,playframework-2.1,typesafe-stack,Sbt,Playframework 2.1,Typesafe Stack,在application.conf(在Play 2.0.4,sbt 0.11.3中)中,我可以使用以下替换: app { major = 0 minor = 1 revision = 62 date = 0127 version = ${app.major}.${app.minor}.${app.revision}.${app.date} } 升级到Play 2.1.0和sbt 0.12.2并将其用于Build.scala之后 val conf = ConfigFactor

在application.conf(在Play 2.0.4,sbt 0.11.3中)中,我可以使用以下替换:

app {
  major = 0
  minor = 1
  revision = 62
  date = 0127
  version = ${app.major}.${app.minor}.${app.revision}.${app.date}
}
升级到Play 2.1.0和sbt 0.12.2并将其用于Build.scala之后

val conf = ConfigFactory.parseFile(new File("conf/application.conf"))
当我玩干净游戏时,我得到错误:

Caused by: com.typesafe.config.ConfigException$NotResolved: need to call resolve() on root config; tried to get value type on an unresolved substitution: ConfigSubstitution(${app.major}"."${app.minor}"."${app.revision}"."${app.date})
    at com.typesafe.config.impl.ConfigSubstitution.valueType(ConfigSubstitution.java:54)
    at com.typesafe.config.impl.DefaultTransformer.transform(DefaultTransformer.java:15)
    at com.typesafe.config.impl.SimpleConfig.findKey(SimpleConfig.java:118)
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:135)
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:140)
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:108)
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:146)
    at com.typesafe.config.impl.SimpleConfig.getString(SimpleConfig.java:188)
    at ApplicationBuild$.<init>(Build.scala:12)
    at ApplicationBuild$.<clinit>(Build.scala)
原因:com.typesafe.config.ConfigException$NotResolved:需要在根配置上调用resolve();试图获取未解析的替换的值类型:ConfigSubstitution(${app.major}.“${app.minor}”。${app.revision}.“${app.date}”)
位于com.typesafe.config.impl.ConfigSubstitution.valueType(ConfigSubstitution.java:54)
在com.typesafe.config.impl.DefaultTransformer.transform(DefaultTransformer.java:15)上
位于com.typesafe.config.impl.SimpleConfig.findKey(SimpleConfig.java:118)
在com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:135)上
在com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:140)上
在com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:108)上
在com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:146)上
位于com.typesafe.config.impl.SimpleConfig.getString(SimpleConfig.java:188)
在ApplicationBuild$(Build.scala:12)
位于ApplicationBuild$(Build.scala)
根据播放配置,应支持此类替换:

但是,实现必须注意允许对象引用 路径本身。例如,这必须起作用:

酒吧{foo:42, baz:${bar.foo} }在这里,如果一个实现在解析替换${bar.foo}的过程中解析了bar中的所有替换,那么会出现 周期实现必须只解析bar中的foo字段, 而不是递归整个条形图对象


有什么办法解决这个问题吗?

好的,我对文档的理解是,您应该使用以下内容:

app {
  major = 0
  minor = 1
  revision = 62
  date = 0127
  version = ${major}.${minor}.${revision}.${date}
}
我没有测试它


也许它在2.0.4下工作是因为一个bug?

您的语法是正确的。看起来您实际上需要调用resolve(),正如错误消息所说的那样,来解析替换。我猜在2.0.x中,play框架做到了这一点,并提供了一个已经以这种方式解决的配置。现在直接使用配置API,需要手动解析

在此行中添加对的调用:

val conf = ConfigFactory.parseFile(new File("conf/application.conf")).resolve()

非常感谢。工作起来很有魅力。