2017-01-28 5 views
1

私はSlingのドキュメントを見て、Groovy scripts can be used to render a componentというJSPまたはHTLの使用方法に似ていることに気づいた。GroovyスクリプトがSlingによって実行された後にキャッシュされる

私はこの考えをあまり気に入っていないので、Groovyコードの場所はOSGiバンドルでなければならないと思っていますが、私はこれらのスクリプトで何ができるかを試してみることにしました。

私は単一のプロパティを持つダイアログで単純なコンポーネントを作成しました。のテキストです。このコンポーネントをsimpleGroovyと呼ぶことにしましょう。ここには大まかな構造(簡潔にするためにダイアログの詳細が省略されています)があります。

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

予想したように、スクリプトがうまく実行され、GStringのとすべて:simpleGroovy.groovy

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

内容は次のようなものです。

ただし、最初のリクエストを行った後にスクリプトを変更すると、同じ出力が得られます。スクリプトの名前を変更してセレクタを使用すると、スクリプトの現在の状態と一致する出力が得られます。これが最初に要求されるまでキャッシュされます。

私はこの原因が不思議です。私は、Groovyスクリプトがある時点でJavaクラスにコンパイルされ、そのクラスがどこかにキャッシュされると思います。

私はAEM 6.2を使用していますので、内容は/crx-quickstart/launchpad/felix/bundle305/data/classesです(305は私の環境ではorg.apache.sling.commons.fsclassloaderのIDです)。

私はexampleアプリケーションからJSPとHTLスクリプトのコンパイルされたクラスを見ることができますが、それらのフォルダの中に私のGroovyスクリプトに関連するものは何もないようです。

私もGroovyランタイム(groovy-all)バンドルのIDを調べましたが、そこにデータフォルダはありません。しかし、Groovyランタイムバンドルを再起動すると、スクリプトに加えた変更を見ることができます。

Groovyスクリプトを再コンパイルするより簡単な方法はありますか?正確に何がキャッシュされ、どこに座るのですか?

+0

groovyをaemに統合するために何をしたのか教えてください。コンポーネントを作成し、代わりに '.groovy'を追加しました。 'Jsp'をコンポーネントスクリプトファイルに追加し、** groovy-all **バンドルをfelixコンソールに追加しました。このコンポーネントをレンダリングしようとすると、このコンポーネントのページに出力が表示されません。 – krish

+0

@krish私は特別なステップを実行していませんでしたが、おそらくこれは、このmanneでGroovyスクリプトを使用するオプションについて学習する前に、Groovy関連のパッケージをインストールしたためです。私はいつも[AEM Groovy Console](https://github.com/OlsonDigital/cq-groovy-console)を使っています。私が必要とするバンドルは、そのパッケージの一部として既に配備されているものと思います。 – toniedzwiedz

+0

これが[slingjsp](http:// localhost:4502/system/console/slingjsp)を使用できるすべてのJSPを再コンパイルするのに役立つかどうかはわかりませんが、バンドルとしての外部Servletエンジン私は、キャッシュをクリアするためにgroovyバンドルを再起動するオプションしかないと思います。 – krish

答えて

1

slingは、コンパイルされたスクリプトをメモリに格納するGroovyScriptEngineを提供します(scriptCacheを参照)。

scriptCacheをクリアするために使用できるものはありません。あなた自身のGroovy Scriptengineとおそらくクラスローダーを書く必要があります。 (これについては100%ではありません)

+0

バンドルを再起動せずにキャッシュをクリアする方法はありますか?おそらくFelixコンソールのボタンでも、OSGiバンドルで公開されているサービスでもかまいません。 – toniedzwiedz

+0

いいえ。私はscriptCacheをクリアするのに利用できるものはないと思います。 – awd

+0

この問題を再現する方法がわかりませんが、この[JVM Groovy](http://stackoverflow.com/questions/35192157/groovy-groovyclassloader-jvm-caching-and-updating-loaded-classes)を参照してください。 – VAr

関連する問題