Groowy脚本在被Sling执行后被缓存

时间:2017-01-28 18:52:43

标签: groovy aem sling

我正在查看Sling文档并注意到Groovy scripts can be used to render a component,类似于JSP或HTL的使用方式。

现在,我不是很喜欢这个想法,我认为Groovy代码的位置应该在OSGi包中,但我决定尝试看看我能用这些脚本做些什么。

我创建了一个简单的组件,其对话框具有单个属性 text 。让我们调用此组件simpleGroovy。这是粗略的结构(为简洁起见省略了对话框细节)。

/apps/example/core/components/simpleGroovy
|
|- cq:editConfig
|- dialog
|- simpleGroovy.groovy

simpleGroovy.groovy的内容是这样的:

println "Hello Groovy! Rendering the contents of ${resource.path} since 2017"

正如所料,脚本执行得很好,GStrings和所有。

但是,当我在发出第一个请求后更改脚本时,我会继续获得相同的输出。如果我重命名脚本并使用选择器,我会得到一个与脚本当前状态相匹配的输出。直到第一个请求时,它也会被缓存。

我对这个原因感到好奇。我想Groovy脚本在某些时候被编译到Java类,并且该类被缓存到某个地方。

我在AEM 6.2上,所以我检查了内容/crx-quickstart/launchpad/felix/bundle305/data/classes(包305是我环境中org.apache.sling.commons.fsclassloader的ID。)

我可以从我的example应用程序中看到JSP和HTL脚本的已编译类,但在任何这些文件夹中似乎都没有与我的Groovy脚本相关的内容。

我还查找了我的Groovy Runtime(groovy-all)捆绑包的ID,但那里没有数据文件夹。但是,重新启动 Groovy Runtime 包可以让我看到我对脚本所做的更改。

是否有更简单的方法可以重新编译Groovy脚本?究竟是什么缓存以及它在哪里?

1 个答案:

答案 0 :(得分:1)

sling使用Groovy提供的GroovyScriptEngine,它将已编译的脚本存储在内存中,请参阅scriptCache

我认为没有任何可用的ootb来清除scriptCache。你将不得不编写自己的groovy scriptengine和可能的类加载器。 (虽然不是100%肯定)