我正在查看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脚本?究竟是什么缓存以及它在哪里?
答案 0 :(得分:1)
sling使用Groovy提供的GroovyScriptEngine,它将已编译的脚本存储在内存中,请参阅scriptCache。
我认为没有任何可用的ootb来清除scriptCache。你将不得不编写自己的groovy scriptengine和可能的类加载器。 (虽然不是100%肯定)