在应用程序中使用groovy脚本的最佳方法

时间:2010-12-05 11:40:31

标签: scripting groovy

我正在尝试在我的应用程序中使用groovy脚本。问题是GroovyScriptEngine #run总是编译脚本,即使它是在以前的运行中编译而且从那以后没有改变。即使我设置了一个物理输出文件夹来保存配置中的编译结果。

解决这个问题的最佳方法是什么?对我来说最好的是我能够使用包含预编译结果的文件夹发送脚本,并且不进行编译(除非脚本被修改)

3 个答案:

答案 0 :(得分:2)

Grails 1.3.5正在使用Groovy 1.7.5。在该Groovy版本中,GroovyScriptEngine.run(..)调用以下方法:createScript(String, Binding) - > loadScriptByName(String) - > isSourceNewer(ScriptCacheEntry)

isSourceNewer(ScriptCacheEntry)定义为(遗憾的是,我在网上找不到匹配的源文件):

protected boolean isSourceNewer(ScriptCacheEntry entry) 
    throws ResourceException {
    // ...

    for (String scriptName : entry.dependencies) {
        // ...
        return true; // without any further condition!
    }

    return false;
}

实现(queer)逻辑“如果脚本具有依赖性,则它比缓存的脚本更新(并且需要重新编译)”。这不是代码应该做的;它应该由修改时间决定。

newer versions of GroovyScriptEngine, this has been corrected中(对逻辑进行了大量更改),但是现在,您需要继承GroovyScriptEngine并覆盖isSourceNewer(ScriptCacheEntry)以自行修复逻辑。< / p>


编辑:Groovy 1.7.6中的错误为reportedfixed。 - 所以尝试在Grails lib 文件夹中使用Groovy 1.7.6。

答案 1 :(得分:1)

我最后使用的解决方案(hack)是使用xstream流出scriptCache变量并将其读回并在对象中设置

答案 2 :(得分:0)

不确定这是否对您有所帮助,但您可以使用CompilerConfiguration改变GroovyScriptEngine的行为(请参阅GroovyScriptEngine。setConfig)。有一个选项CompilerConfiguration。setRecompileGroovySource,可以用来设置是否重新加载和重新编译源代码。您可以阅读有关CompilerConfiguration here的更多信息(第282页)。