HOT deploy の便利さに脳が停止した

 いや〜。ほんとうに HOT deploy はいいものですね。


 しか〜しっ! あまりにもそれに浸っていたがため脳が停止し、くだらないことに長い時間を割いてしまったのです。そんな私の話。


 あるとき、↓こんな例外が発生。

java.lang.LinkageError: loader constraint violation: loader...

 どうやらクラスローダまわりがよろしくないらしい。「なんじゃこりゃあ〜! やっぱり、Javaスクリプト言語なみにさくさくという夢をみるのはまちがっていたのか?!」とうろたえることしばし。


 原因は、S2Contaienr の管理下にないクラスで HOT deploy の対象となっているクラスを使ったことでした。

 例外は別になりますが具体的な例をあげますと、自作のサーブレットフィルタ内で↓こんなことをしたわけです。

HogeDto hogeDto = SingletonS2Container.getComponent(HogeDto.class);

 サーブレットフィルタはサーブレットコンテナのクラスローダでロードされるわけで、HogeDto クラスもそれでロードされます。しかし、S2Container の中的にはたぶん HOT deploy 用のクラスローダで別に HogeDto をロードするので、HogeDto は HogeDto にキャストできません! という一見意味不明な例外が発生します。

 ということで、S2Container の管理下にないクラスから HOT deploy の対象となっているクラスを使う場合は、インタフェースを通して使うか、コンポーネント名から java.lang.Object クラスとして取得して動的にメソッドを呼ぶ(リフレクションを使って)のが良さそうです。