【问题标题】:Groovy script gets cached after being executed by SlingGroovy 脚本在被 Sling 执行后被缓存
【发布时间】:2017-01-28 18:52:43
【问题描述】:

我在查看 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 脚本?究竟什么被缓存了,它在哪里?

【问题讨论】:

  • 你能告诉我你为将 groovy 集成到 aem 所做的步骤吗?我创建了一个组件并添加了一个 .groovy 来代替。 Jsp 在组件脚本文件中并将 groovy-all 捆绑包添加到 felix 控制台中,当我尝试渲染此组件时,我在页面中看不到该组件的任何输出。跨度>
  • @krish 我没有执行任何额外的步骤,但这可能是因为我在了解以这种方式使用 Groovy 脚本的选项之前已经安装了一堆与 Groovy 相关的包。我几乎一直在使用AEM Groovy Console。我想我需要的任何包都已经作为该包的一部分进行了部署。
  • 谢谢,我不确定这是否有助于重新编译我们可以使用 slingjsp 的所有 JSP,但是对于 groovy 脚本,我们将有一个外部 Servlet 引擎作为捆绑包我们只能选择重启 groovy 包来清除缓存。

标签: groovy aem sling


【解决方案1】:

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

我认为没有任何可用的 ootb 来清除 scriptCache。您将不得不编写自己的 groovy 脚本引擎和可能的类加载器。 (虽然不是 100% 确定这一点)

【讨论】:

  • 有没有办法在不重新启动捆绑包的情况下清除缓存?可能是 Felix 控制台中的一个按钮,也可能是 OSGi 捆绑包中公开的一个服务。
  • 不。我认为没有任何可用的 ootb 来清除 scriptCache。
  • 我不确定如何重现此问题,但请查看JVM Groovy
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多