在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并将此suggestion用于Build.scala后,
val conf = ConfigFactory.parseFile(new File("conf/application.conf"))
我play clean
时出错:
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)
基于播放配置documentation,应支持此类替换:
但是,实现必须注意允许对象引用 他们自己的路径。例如,这必须起作用:
吧:{foo:42, baz:$ {bar.foo} 这里,如果一个实现解决了bar中的所有替换,作为解析替换$ {bar.foo}的一部分,那么将会有一个 周期。实现必须只解析bar中的foo字段, 而不是递归整个条形对象。
任何想法如何解决这个问题?
答案 0 :(得分:3)
您的语法是正确的。您似乎确实需要调用resolve(),如错误消息所示,以解决替换问题。我想在2.0.x中,play框架做到了这一点并提供了一个已经通过这种方式解决的配置。现在直接使用配置API,需要手动解决。
在此行中添加对resolve()
的来电:
val conf = ConfigFactory.parseFile(new File("conf/application.conf")).resolve()
答案 1 :(得分:0)
AFAIK,我对该文档的理解是你应该使用类似的东西:
app {
major = 0
minor = 1
revision = 62
date = 0127
version = ${major}.${minor}.${revision}.${date}
}
我没有测试它......
也许它因为一个bug而在2.0.4下工作了?