SAStruts の LinkageError で足踏み
SAStruts でテストケースを用意してユニットテストを頑張っていたら、なぜか触っていないはずのアプリケーションにて、java.lang.LinkageError が発生して動かなくなってしまった。初めて見た、このエラー。
java.lang.LinkageError: loader constraint violation: loader (instance of org/apache/catalina/loader/WebappClassLoader) previously initiated loading for a different type with name "com/deftrash/app/dto/SampleDto"
どうやら例によって HotdeployClassLoader と Tomcat のクラスローダのせめぎあいの問題のようだ。ただ、今回は1回目だけ〜ということもなく、ずーっと起こる。いまいち仕組みが理解できてないっす…。
HotdeployClassLoader より先に Tomcat の WebappClassLoader が対象クラスをロードしちゃっているので、他のHOTなクラスと型が合わなくてエラーになっているってことか。でも、今まで動いていたということは、HotdeployClassLoader より先に WebappClassLoader がロードするような箇所がどっかに生み出されたというわけで…。
で、冒頭のテストケース。
SampleDto を参照するクラス com.deftrash.app.util.SampleUtil があって、これのテストケースを、com.deftrash.app.util.SampleUtilTest として用意。当然テストケースでも SampleDto を参照する。ところが、SampleUtilTest は名前的に SMART Deploy 対象ではないから、HotdeployClassLoader ではなくて WebappClassLoader が最初にロードすることになって…ということかな?
実際、SampleUtilTest の名前を TestSampleUtil に変更したら、エラーが出なくなった(と思う)。要は、テストケースクラスも Hotdeploy の対象にしてしまったんだけど、なんか違う気がする。
SAStruts では、どういうパッケージ構成というかファイル構成でテストケースを用意してやっていくのがセオリーなんだろう。同じパッケージにテスト対象とテストケースが入るような構成じゃダメなんか…。それとも、何か根本的に間違ってるのかな??