最終更新日 :
2021年4月27日
問題点
crx/de でコードが正しく更新された後でも、新規にデプロイされた sightly コードは AEM サイトに反映されません。このサイトは、一部のパブリッシュインスタンスで古い sightly コードを表示します。
環境
AEM6.1, 6.2, 6.3
原因
コードはすべてのパブリッシュインスタンスに適切にデプロイされるため、問題は、特定のインスタンスまたはインスタンス上の sightly コードの再コンパイルにあります。
コードデプロイメントが AEM インスタンスで発生した場合はいつでも、新規にデプロイされたコードは、関連ページが要求されると、既存のコードを再コンパイルするように強制しなければなりません。新規に追加されたコードが適切に検出されず、そのため再コンパイルが強制されないという Sightly[1] の既知の問題があります。
[1] https://issues.apache.org/jira/browse/SLING-6612
解決策
スクリプティング HTL エンジンのバージョン 1.0.34 搭載している AEM リリースにて、この問題が完全に解決できます。一方、すべての AEM インスタンスにて一様なエクスペリエンスを確保するためにデプロイメントプロセスに以下の手順がおこなってください。
- AEM インストールディレクトリにスクリプト[2]を配置し、それを実行する権限を AEM ユーザーに付与します。
- AEM サーバーにスクリプトが配置されている場所に移動し、次のコマンドを使用して実行します。次の例では、サンプルスクリプトが AEM インストールディレクトリに配置されています。
./cq-force-recompilation.sh crx-quickstart/ http://localhost:4526 admin:admin
- 出力は次のようになります。
stopping the org.apache.sling.commons.fsclassloader bundle... deleting file sytem classes cache: /Users/ anearora /Desktop/AEM/6.2/TestServer/ crx -quickstart/launchpad/ felix /bundle305/data/classes ... deleting /var/classes in the JCR... starting the org.apache.sling.commons.fsclassloader bundle...
以前コンパイルしたライブラリを消去し、関連ページが要求されたときに更新されたライブラリを強制的にコンパイルします。
[2] force-recompilation.sh
#!/bin/bash if [[ $# -ne 3 || $1 == "-h" ]]; then echo "Usage: force-recompilation.sh <crx-quickstart-dir> <http://server:port> <user:password>" echo echo "Example arguments: crx-quickstart/ http://localhost:4502 admin:admin" echo echo "This will force a recompilation of all Sling scripts (jsps, java, sightly etc.)." exit fi dir="$1" host="$2" user="$3" if [ ! -d "$dir/../crx-quickstart" ]; then echo "No crx-quickstart directory found." exit fi echo "stopping the org.apache.sling.commons.fsclassloader bundle..." bundle="org.apache.sling.commons.fsclassloader" curl -f -s -S -u $user -F action=stop $host/system/console/bundles/$bundle > /dev/null exitCode=$? if [ $exitCode -ne 0 ]; then echo if [ $exitCode -eq 22 ]; then echo "Invalid admin password." fi echo "aborted."; exit fi cd "$dir" classesDir=`find launchpad/felix -path "*/bundle*/data/classes" -type d` if [ -d "$classesDir" ]; then echo "deleting file sytem classes cache: `pwd`/$classesDir ..." rm -rf "$classesDir" else echo "file system classes cache empty or already cleared" fi echo "deleting /var/classes in the JCR..." curl -f -s -S -u $user -X DELETE $host/var/classes > /dev/null echo "starting the org.apache.sling.commons.fsclassloader bundle..." curl -f -s -S -u $user -F action=start $host/system/console/bundles/$bundle > /dev/null if [ $? -ne 0 ]; then echo echo "aborted, bundle was likely not restarted."; exit fi echo "done."