CLASSPATH と NoClassDefFoundError
某ツールを評価中。
CLASSPATH はきちんと設定した。そして、以下のコマンドでツールを起動する。
java -jar hoge-tools.jar params
すると、NoClassDefFoundError が発生する。CLASSPATH をきちんと設定しているのに見えてないんだろうか?と、以下のコマンドを試す。
javap (NoClassDefFoundError が出たクラスの FQCN)
エラーにならない。クラスが見えている。なのに、なんで NoClassDefFoundError が?
ふと思い出す。hoge.jar を解凍してみる。すると、MANIFEST.MF の中に以下の設定があった。
Class-Path:hoge.jar
つまり、hoge.jar を CLASSPATH に追加しても意味が無かったのだ。hoge-tools.jar は hoge.jar が同じディレクトリに存在することを前提にしていた。。。(これって、分かりにくい仕様だよね)
そのような場合は、コマンドラインで以下のように指定すれば動作する。
java -jar (絶対パス)/hoge-tools.jar params
テストを実行するたびに結果が違う。。。
某ツールは JNI を使っている。で、JUnit の画面を起動しっぱなしでテストを繰り返すと、成功と失敗を交互に繰り返す。出ているエラーの内容は以下のとおり。
java.lang.UnsatisfiedLinkError: Native Library C:(snip)\hoge.dll already loaded in anothre classloader
JUnit って、実行するたびに新しい ClassLoader を作ってるんだろうか?で、テストが終わったときじゃなくて、テストを開始したときに前回生成した ClassLoader が GC されてる???
ちなみに、
protected void tearDown() { System.gc(); }
なんてやってみたけど改善されない。このコードが動くってことはまだ GC の条件を満たしてないんで、当然の結果なんだけど。。。
テストできないわけじゃないが、1回置きにエラーが出るって、気持ち悪いー。
気にしないようにしてるけど、すげー気になる。なんとかならんかのー。textui でやるしかない?
解決案ぼしゅー!
追記:ツールのベンダーにメールで問い合わせてみた。。。って、アメリカのベンダーだもんで、英語で質問してみたんだけど、通じるんだろうか?(^^;