如何检查 groovy 脚本的编译错误 [重复]

Posted

技术标签:

【中文标题】如何检查 groovy 脚本的编译错误 [重复]【英文标题】:How to check groovy script for compilation errors [duplicate] 【发布时间】:2015-11-13 23:26:36 【问题描述】:

我们可以使用下面的代码在运行时创建和运行 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 块对我不起作用。

【问题讨论】:

gcl.parseClass 包裹在try...catch 中?不要以为我理解这个问题...... 我同意蒂姆的观点,不明白是什么问题,解决方案还可以。捕获 MultipleCompilationErrorsException 和可能 CompilationFailedException 你不能测试一些不存在的会失败的东西。 Sample 类在您运行脚本之前不存在。你是在问是否有办法告诉groovyScript 告诉你它是否会先失败?我不确定他们会给你买什么,因为无论如何你都必须运行它才能走得那么远。 @Gregg 我正在从可修改的前端添加脚本数据(脚本是域的属性)。如果有人像上面的例子一样改变它,应该检查它是否有任何验证错误。所以,我正在编写一个自定义验证器,我想验证脚本字段至少有一个没有编译错误的编译脚本。 添加了 try catch 块什么也没发生。但我得到了我在下面发布的答案。 【参考方案1】:

GroovyShell 使用 try-catch 块运行良好。

                  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
        

虽然一个后备方案是,只要您有一个部分脚本代码,其余代码将稍后从其他脚本添加。此代码将失败,但这是开发人员问题,而不是技术问题。

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

【讨论】:

以上是关于如何检查 groovy 脚本的编译错误 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

错误记录Android Studio 中编写 Gradle 编译脚本时没有 Groovy 代码提示 ( Cannot find declaration to go to )

GroovyGroovy 脚本调用 ( Groovy 脚本编译 | Groovy 脚本字节码文件分析 )

Groovy编译时元编程 ( ASTTransformation#visit 方法简介 | org.codehaus.groovy.ast.ModuleNode 脚本节点 )

如何将目录的所有内容(不包括父目录)移动到另一个目录 Groovy [重复]

Java调用groovy及groovy中如何使用springBean

使用未经检查或不安全的操作,使用 -Xlint 重新编译:未检查详细信息 [重复]