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 では、どういうパッケージ構成というかファイル構成でテストケースを用意してやっていくのがセオリーなんだろう。同じパッケージにテスト対象とテストケースが入るような構成じゃダメなんか…。それとも、何か根本的に間違ってるのかな??