きどたかのブログ

いつか誰かがこのブログからトラブルを解決しますように。

ZFileExceptionがNoClassDefFoundError

なんか知らんけど、これまで動いてたと思っていたものが、
サーバー上で全く動いた実績がなかったことが判明した。
半年くらい動いてなかったことに気付いてないことを恥としたい。
(だから言ってるだろう、コメントアウトでやり過ごすなって・・・)


NoClassDefFoundErrorは、コンパイル時にはあったクラスが、実行時に無いという類。
だいたいの場合は、スーパークラスや、インターフェースや、メソッド内部で使うクラス等、
クラス定義として参照しているクラスが行方不明だとこういうのになったはず。


ZFileExceptionは、..../IBM/WebSphere/AppServer/plugins/com.ibm.ws.runtime.jarに含まれていました。
com.ibm.jzos.ZFileExceptionと、これはjzosなんだけど、なぜwsのruntimeに入っているのかは謎です。
cookbookとかだと、ibmjzos.jarとして登場する。
これはWebSphereというよりは、z/OS上のJavaに付属する類なのではなかろうか。


eclipseでは、サーバランタイムはRAD付属のstubにはクラスはなく、本物のサーバランタイムを指してる。
これが一番手軽にZFileExceptionにクラスパスを通す方法だったからだ。
で、デプロイすると、サーバーにあのjarが読み込まれていないので例のやつが出る。
com.ibm.ws.runtime.jarってあるのに読み込まれないというのもちょっと紛らわしい。
対応は至極簡単だ、ibmjzos.jarを持ってきて、どっかに置くのだ。
一般的には拡張クラスローダーに読ませるっぽい。


なので、試しに読ませた。(WinでもLinでも試した。zは僕の手元にないから知らない)
/opt/IBM/WebSphere/AppServer/java/jre/lib/ext/ibmjzos.jar
 本当にここでいいのかは疑問なんだけど…。
あとバージョンも何が良いのか不明。
まあ、分散環境で動かすつもりはないので、大人しくしとけってことさ。


クラスローダービューワーで、どのクラスローダーに食われたかも確認が出来る。