Problem
Auch nach der erfolgreichen Aktualisierung des Codes in crx/de wird der neu bereitgestellte, visuelle Code nicht in der AEM-Seite angezeigt. Die Website zeigt immer noch den alten, visuellen Code für einige Veröffentlichungsinstanzen an.
Umgebung
AEM 6.1, 6.2, 6.3
Ursache
Da der Code für alle Instanzen bereitgestellt wird, besteht das Problem in der Neukompilierung von visuellem Code für bestimmte Instanzen.
Immer wenn eine Entwicklung von Code auf einer AEM-Instanz ausgeführt wird, muss sich der neu bereitgestellte Code aus dem vorhandenen Code zwingen und neu kompilieren, wenn die verknüpfte Seite angefordert wird. Es gibt ein bekanntes Problem mit Sightly[1], das den neu hinzugefügten Code nicht richtig erkennt und daher keine Neukompilierung erzwingt.
[1] https://issues.apache.org/jira/browse/SLING-6612
Lösung
Die vollständige Lösung für dieses Problem ist in der AEM-Version mit der HTL-Engine-Scripting-Version 1.0.34 verfügbar. In der Zwischenzeit sollten Sie die folgenden Schritte in den Bereitstellungsprozess integrieren, um eine einheitliche Nutzung aller AEM-Instanzen sicherzustellen.
- Platzieren Sie das Skript [2] im AEM-Installationsverzeichnis und erteilen Sie dem AEM-Benutzer Berechtigungen zum Ausführen.
- Gehen Sie zur Position, an der das Skript auf dem AEM-Server platziert wird und führen Sie es mithilfe des folgenden Befehls aus. Im folgenden Beispiel wird das Beispielskript im AEM abgelegt.
./cq-force-recompilation.sh crx-quickstart/ http://localhost:4526 admin:admin
- Die Ausgabe sieht wie folgt aus:
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...
Die zuvor kompilierten Bibliotheken werden gelöscht und die aktualisierten Bibliotheken werden kompiliert, wenn die zugehörige Seite angefordert wird.
[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."