Сценарий Groovy кэшируется после выполнения Sling

Я просматривал документацию Sling и заметил, что скрипты Groovy можно использовать для отображать компонент аналогично тому, как можно использовать 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 в моей среде).

Я вижу скомпилированные классы для сценариев JSP и HTL из моего приложения example, но, похоже, ни в одной из этих папок нет ничего, связанного с моим сценарием Groovy.

Я также посмотрел идентификатор моего пакета Groovy Runtime (groovy-all), но там нет папки с данными. Однако перезапуск пакета Groovy Runtime позволяет мне увидеть изменения, которые я внес в свой скрипт.

Есть ли более простой способ перекомпилировать сценарий Groovy? Что именно кэшируется и где находится?


person toniedzwiedz    schedule 28.01.2017    source источник
comment
можете ли вы сообщить мне, какие шаги вы предприняли для интеграции groovy в aem, я создал компонент и добавил .groovy вместо. Jsp в файле сценария компонентов и добавил пакет groovy-all в консоль felix, и когда я попытался отобразить этот компонент, я не вижу никаких выходных данных на странице для этого компонента.   -  person krish    schedule 29.01.2017
comment
@krish Я не выполнял никаких дополнительных шагов, но это, вероятно, потому, что я установил кучу пакетов, связанных с Groovy, до того, как узнал о возможности использования сценария Groovy таким образом. Я почти постоянно использую консоль AEM Groovy. Я предполагаю, что все необходимые мне пакеты уже были развернуты как часть этого пакета.   -  person toniedzwiedz    schedule 29.01.2017
comment
спасибо, я не уверен, поможет ли это вообще перекомпилировать все JSP, которые мы можем использовать slingjsp , но для groovy-скриптов у нас будет внешний движок Servlet в качестве пакета, я думаю, у нас есть только возможность перезапустить groovy-пакет для очистки кеша.   -  person krish    schedule 30.01.2017


Ответы (1)


sling использует предоставленный Groovy GroovyScriptEngine, который хранит скомпилированные сценарии в памяти, см. scriptCache.

Я не думаю, что есть что-то доступное ootb для очистки scriptCache. вам придется написать свой собственный скриптовый движок и, возможно, загрузчик классов. (хотя и не на 100% уверен в этом)

person awd    schedule 29.01.2017
comment
Есть ли способ очистить кеш без перезапуска бандла? Это может быть кнопка в консоли Felix или служба, предоставляемая пакетом OSGi. - person toniedzwiedz; 29.01.2017
comment
Нет. Я не думаю, что есть что-то доступное ootb для очистки scriptCache. - person awd; 29.01.2017
comment
я не уверен, как воспроизвести эту проблему, но взгляните на этот JVM Отлично - person VAr; 30.01.2017