【问题标题】:Why is this groovy code throwing a MultipleCompilationErrorsException?为什么这个 groovy 代码会引发 MultipleCompilationErrorsException?
【发布时间】:2009-02-17 21:16:51
【问题描述】:
我有以下 groovy 代码:
class FileWalker {
private String dir
public static void onEachFile(String dir,IAction ia) {
new File(dir).eachFileRecurse {
ia.perform(it)
}
}
}
walker = new FileWalker()
walker.onEachFile(args[0],new PrintAction())
我注意到如果我在 walker 前面放置一个 def ,脚本就可以工作。这不应该像现在这样工作吗?
【问题讨论】:
标签:
exception
scripting
groovy
【解决方案1】:
在 groovyConsole 或 groovy 脚本中不需要 def。我认为拥有它是一种很好的编程习惯,但是没有它,语言也可以工作,并将这些类型的变量添加到脚本绑定中。
我不确定您的其余代码(因为它不会像您发布的那样编译)。但是您要么有一个非常旧的 groovy 版本,要么您的配置或其余代码有其他问题。
通过为缺少的 IAction 接口和 PrintAction 类添加一个存根,我可以让它在不修改的情况下运行:
interface IAction {
def perform(obj)
}
class PrintAction implements IAction{
def perform(obj) {
println obj
}
}
class FileWalker {
private String dir
public static void onEachFile(String dir,IAction ia) {
new File(dir).eachFileRecurse {
ia.perform(it)
}
}
}
walker = new FileWalker()
walker.onEachFile(args[0],new PrintAction())
我创建了一个包含“foo/bar”和“foo/baz”文件的虚拟目录。
如果我将它保存到“walkFiles.groovy”并使用
从命令行调用它
groovy walkFiles.groovy foo
打印出来:
foo/bar
foo/baz
这是最新版本的 groovy:
groovy -v
Groovy Version: 1.6-RC-3 JVM: 1.5.0_16
【解决方案2】:
在脚本模式下(或通过“groovyConsole”),您需要在使用前用“def”声明walker。 Groovy 脚本文件在编译之前被翻译成类 Script 的派生类。所以,每一个声明都需要做好。
另一方面,当您在“groovysh”(或使用 GroovyShell 类的实例)中运行脚本时,其机制会自动绑定每个引用对象,而无需声明。
更新:
我上面的答案是错误的,因为我反编译了 Groovy 的 .class 并发现它也在脚本中使用了绑定对象。因此,我的第一段确实是错误的。