为什么这个groovy代码抛出MultipleCompilationErrorsException?

时间:2009-02-17 21:16:52

标签: exception scripting groovy

我有以下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 ,脚本就可以了。这不应该像现在这样工作吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在脚本模式下(或通过“groovyConsole”),在使用之前需要使用“def”声明walker。 Groovy脚本文件在编译之前会被转换为类Script的派生类。因此,每个声明都需要正确完成。

另一方面,当您在“groovysh”中运行脚本(或使用GroovyShell类的实例)时,其机制会自动绑定每个引用对象而无需声明。

<强>更新: 我上面的回答是错误的,因为我反编译了.class的Groovy并发现它在脚本中也使用了一个绑定对象。因此,我的第一段确实是错误的。