AEM Developerの皆様お疲れさまです。大和株式会社の狩野です。
Qiitaのアドベントカレンダーに便乗して始めた記事投稿イベント8日目です。
今日8日目の内容は、ローカル環境でコードが反映されない時に取る行動です。
7日目の記事→【AEMモダナイズ】静的テンプレートと編集可能テンプレートの共存
ローカル環境で開発していて、さっきインストールしたはずなのに、インストールする前と動作が変わらないと感じること、恐らく何度かあると思います。
そういう時に取る行動について書こうと思います。
なお、これらの行動はほとんど「ローカル環境」でしか使うことが出来ないものばかりです。
お客様先の環境で使うと大変なことが起きますので注意してください。
ざっくりまとめ
まず、いきなりですがどこを見るかの一覧をざっくり書こうと思います。
体感では、バージョンが古いAEMを使っている場合、コードが反映されないといった事象はよく発生する印象があります。
- 実行時エラー、構文エラーを疑う
- ブラウザキャッシュ削除(Chromeの場合Shift+F5)
- system/console/slingjsp の Recompile All JSPs(AEM6.5の場合、system/console/fsclassloader の Clear Class Loader)
- コードを変更したファイルをCRXDEで削除してから反映させ直す
- (bundleの場合)installフォルダを1回削除してCRXDEのPackage Managerからインストールし直す
- AEM再起動
- AEMインスタンス作り直し(本当にどうしようもなくなった時だけ)
上記箇所の上から順番に疑うようにしてください(下になるほど大掛かりになるので)
以下では、1つ1つについて解説していきたいと思います。
実行時エラー、構文エラーを疑う
まず、これが絶対に無いと言い切れるまでコードを精査してから、下の手順に移行しましょう。
そうでないと、全てが徒労に終わります。
実行時エラー
一番ありがちな実行時エラーはなんといっても NullPointerException
でしょう。
NullPointerException
によってコードが中断されていて、反映されてるように見えないといったことがしばしばあります。
特にAEM標準API(com.day.cq.wcm.api, org.apache.sling.api.resource, javax.jcr)はしょっちゅうnullを返すので、無対策ではこれが頻発します。
ここをまず最初に疑わないと、以下の行動は全て無駄になります。
これについての対策は、前に当ブログでも掲載したAEM標準APIのNPE対策を参考にしてください。
構文エラー
bundle内のJavaコードの構文エラーはAEMにインストールする前にpackageをビルド時や、IDEや高機能エディタで警告などが出ていたりで、AEMにインストールする前に気づく機会はあります。
しかし、JSP上に書いたJavaコードでの構文エラーなどはそういう工程がありませんので、構文エラーに気づけないということもあります。
今どきのAEM開発では、JSP上にJavaコードを書くということはあまり無いとは思いますが、古いコードの改修などで起きることもありますので、このへんは自分で注意するしかないのが悲しいところです。
ブラウザキャッシュ削除
しばしば、これが悪さをしてコードが前のままになっていることがあります。
system/console/slingjsp の Recompile All JSPs(AEM6.5の場合、system/console/fsclassloader の Clear Class Loader)
JSPをコンパイルし直すという作業です。
ここまでの3つの作業で、9割くらいは反映されると思います。
コードを変更したファイルをCRXDEで削除してから反映させ直す
何故かコードを変更したのに、変更前のコードが参照されてページに表示されている場合があります。
そういう時はファイルを削除してから反映させ直してください。
(bundleの場合)CRXDEの/apps配下からinstallフォルダを1回削除してCRXDEのPackage Managerからインストールし直す
bundleを入れ直すという作業です。
まれに新しくインストールしたのに古いbundleを呼び出していることがあります。
そういう時は、CRXDEから削除してinstallフォルダをまっさらな状態にしてから入れ直すということをするとbundleの変更が反映されたりします。
AEM再起動
本当の本当の本当にまれに上の全部を行っても古いコードのままだったりすることがあります。
そういう時はAEMを再起動しましょう。たまに直ります。
AEMインスタンス作り直し(本当にどうしようもなくなった時だけ)
今までAEM開発してきて、一度だけ上のどれをやっても変更が行われなくてインスタンスを作り直してやっと反映されたことがありました。
恐らく、ローカルで開発するからと言ってpackageインストールをあまりにも何度も繰り返していたら、インスタンスに負荷がかかって、新しいコードが反映されないみたいなことが起きたのでしょうか。詳細はわかりません……。
最後に
以上となります。明日(来週の月曜)の内容も私が執筆します。内容は「ダイアログ選択肢をJSで生成する(Classic UI, Touch UI両対応)」です。
お楽しみに。