在scala中使用typesafe配置库时,尝试找到一种非常简单,干净的方法来打印文件路径和键以及application.conf
文件中存在的值。我发现很多例子几乎可以满足我的需求,但无法弄清楚如何正确地过滤到仅在文件中的键。例如,我尝试了以下变化,但它打印了太多的值以及我需要的内容,例如akka
等,我不知道它从哪里来。
val keys = propReader.getConfig().entrySet().map(_.getKey)
val values = propReader.getConfig().entrySet().map(_.getValue)
for (key <- keys) if (key.contains("mykey"))
for (value <- values) println(key, value)
还试过但也打印太多了
private def listingPathsAndKeys(config: Config) {
import scala.collection.JavaConversions._
def display(codeAsString: String)(body: => Any) {
println(body)
}
display("config.root().keySet()") {
config.root().render(ConfigRenderOptions.concise())
}
}
listingPathsAndKeys(propReader.getConfig())
这给了我根级别键,理想情况下我想过滤到我文件中的特定根,只打印键/值:
config.root().keySet()
答案 0 :(得分:0)
我不知道如何打印正在使用的application.conf
路径。但是,我可以推荐一种打印key-value
对的好方法:
1。
在application.conf
中将参数括在指定的命名空间中。
<强> application.conf:强>
sample-configuration = {
key1 = "value1"
key2 = "value2"
}
2。 在应用程序中加载配置并仅打印指定命名空间中的参数:
val config: Config = ConfigFactory.load()
val sampleConfig: Config = config.getConfig("sample-configuration")
println(sampleConfig)
答案 1 :(得分:0)
此答案基于Typesafe Config 1.3.1
要获取配置文件的路径,首先在application.conf
中获取子树(检查@ fcat的答案),返回Config
对象,然后在其上使用origin()
方法。您将获得ConfigOrigin
字段,其中url
字段指向您的application.conf
:
config.getConfig("sample-configuration").origin()
换句话说 - 这将返回配置子树的原点,在您的情况下是application.conf
文件。但是,在某些情况下ConfigOrigin.url
可以为空。
您提供的代码不包含有关如何实际加载配置的任何信息。根据您的描述,我假设它是ConfigFactory.load()
,在这种情况下,库使用一堆默认值来加载类路径中存在的不同配置。这就是为什么你得到application.conf
中不存在的一些密钥的原因。由于ConfigFactory.load()
实际上从类路径中找到的合并Config
返回,因此无法获得其“合并”原点。
答案 2 :(得分:0)
试图做同样的事情以确定哪个值来自哪个配置文件。另一种方法是编写一个脚本,将当前文件路径附加到每个值之后,然后转储合并的配置文件,然后您就可以知道该值来自哪个文件。
答案 3 :(得分:0)
您可以使用此工具:Hocon Config Printer
它将显示“最终”配置文件,以及从中读取每个设置的文件。
示例:
hocon-config-printer conf/application.conf -verbose
输出:
{
# conf/akka.conf: 1-5
"akka" : {
# conf/akka.conf: 9
"actor" : {
# conf/akka.conf: 10
"default-dispatcher" : {
# conf/akka.conf: 11
"fork-join-executor" : {
# conf/akka.conf: 12
"parallelism-factor" : 3,
# conf/akka.conf: 14
"parallelism-max" : 200,
# conf/akka.conf: 13
"parallelism-min" : 10
...