我正在尝试在我的应用程序中使用groovy脚本。问题是GroovyScriptEngine #run总是编译脚本,即使它是在以前的运行中编译而且从那以后没有改变。即使我设置了一个物理输出文件夹来保存配置中的编译结果。
解决这个问题的最佳方法是什么?对我来说最好的是我能够使用包含预编译结果的文件夹发送脚本,并且不进行编译(除非脚本被修改)
答案 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中的错误为reported和fixed。 - 所以尝试在Grails lib 文件夹中使用Groovy 1.7.6。
答案 1 :(得分:1)
我最后使用的解决方案(hack)是使用xstream流出scriptCache变量并将其读回并在对象中设置
答案 2 :(得分:0)
不确定这是否对您有所帮助,但您可以使用CompilerConfiguration改变GroovyScriptEngine的行为(请参阅GroovyScriptEngine。setConfig)。有一个选项CompilerConfiguration。setRecompileGroovySource,可以用来设置是否重新加载和重新编译源代码。您可以阅读有关CompilerConfiguration here的更多信息(第282页)。