最近,我将logback配置文件从logback.xml切换到了logback.groovy。在这种情况下,将DSL与Groovy结合使用比XML更具通用性。
我需要以编程方式分析此文件,就像我分析以前的XML文件(无数种分析工具中的任何一种一样)。我意识到这将是不完美的,因为DSL配置文件位于它配置并必须执行的对象的顶部,因此其结果不可避免地是动态的,而XML文件是静态的。
如果要在另一个文件中包含一个Groovy文件,则有解决方案。 This one为我工作。
但是我正在努力从结果中找到我需要的东西。
如果我在DSL文件中放置了这样的功能...
def greet(){
println "hello world"
}
...我不仅可以执行它(如下所示config.greet()
,而且我也可以在运行时看到它列出的信息
GroovyShell shell = new GroovyShell()
def config = shell.parse( logfileConfigPath.toFile() )
println "config.class.properties ${config.class.properties}"
但是如果我在DSL文件中放入这样的行...
def MY_CONSTANT = "XXX"
...我不知道如何找到它并获取它的值(config.class.properties
的输出混乱而丰富)。
PS打印出config.properties
只是给出了这个:
[class:class logback, binding:groovy.lang.Binding@564fa2b]
...,是的,我确实看过config.binding.properties
:什么都没有。
def
的使用在脚本的执行过程中创建了一个局部变量,该变量在脚本的绑定中不可用;参见this。即使删除def
也不会在绑定中显示MY_CONSTANT,因为通过GroovyShell.parse()
解析脚本不会解释/执行代码。
要在config
的绑定中显示MY_CONSTANT,请将def MY_CONSTANT = "XXX"
更改为MY_CONSTANT = "XXX"
,然后通过config.run()
执行配置脚本。