問題点

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."

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー