如何检查groovy脚本是否存在编译错误

时间:2015-08-20 10:49:20

标签: grails groovy grails-plugin grails-2.0

我们可以使用下面的代码

在运行时创建和运行groovyscript
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;

import java.io.File;
import java.io.IOException;

        // Create a String with Groovy code.
        final StringBuilder groovyScript = new StringBuilder();
        groovyScript.append("class Sample {");
        groovyScript.append(" String sayIt() { return \"Groovy says: Cool jajaja\" }");
        groovyScript.append("}");



        GroovyClassLoader gcl = new GroovyClassLoader()

        GroovyCodeSource codeSource = new GroovyCodeSource(groovyScript.toString(), "aa", GroovyShell.DEFAULT_CODE_BASE)

        //GCL will check for enabled cache over code source and use sourceCache to cache code with name
        def scriptClass =  gcl.parseClass(codeSource)
                def classInstance = scriptClass.newInstance()

assert "Groovy says: Cool jajaja".equals(classInstance.sayIt())

现在假设在上面的代码中,我们引入了一个错误,现在上面的代码如下:

import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;

import java.io.File;
import java.io.IOException;

        // Create a String with Groovy code.
        final StringBuilder groovyScript = new StringBuilder();
        groovyScript.append("class Sample {");
        groovyScript.append("jajaja");
        groovyScript.append(" String sayIt() { return \"Groovy says: Cool jajaja\" }");
        groovyScript.append("}");

        GroovyClassLoader gcl = new GroovyClassLoader()

        GroovyCodeSource codeSource = new GroovyCodeSource(groovyScript.toString(), "aa", GroovyShell.DEFAULT_CODE_BASE)

        //GCL will check for enabled cache over code source and use sourceCache to cache code with name
        def scriptClass =  gcl.parseClass(codeSource)
                def classInstance = scriptClass.newInstance()

assert "Groovy says: Cool jajaja".equals(classInstance.sayIt())

注意,我们添加了" jajaja"在课后宣言中有脚本。

这里应该做些什么才能知道我们的脚本有编译错误,并且会因MissingPropertyException或其他异常而失败。

当尝试使用groovyConsole时,它会破坏脚本并出现以下错误

1 compilation error:

unexpected token: jajaja at line: 1, column: 15

我们可以在运行之前测试任何编译错误的脚本吗? 添加try catch块对我来说并不适用于此代码。

1 个答案:

答案 0 :(得分:0)

使用try-catch块可以很好地运行GroovyShell。

                  GroovyCodeSource codeSource = new GroovyCodeSource(script, "aa", GroovyShell.DEFAULT_CODE_BASE)

        //GCL will check for enabled cache over code source and use sourceCache to cache code with name
        def scriptClass
        try {
            def shell = new GroovyShell()
            def data = shell.parse(codeSource.scriptText)
            data.run()
        }catch (Throwable e){
            status = false
        }
        if(!status){
            return "domain.script.compilation.errors"
        }else{
            return true
        }

虽然一个后备是每当你有一个部分的脚本代码,其余的代码将在以后从其他脚本添加。此代码将失败,但这是开发人员问题,而不是技术问题。

此外,这将运行可能导致数据更新的脚本。