ClassNotFoundExceptionの原因と対策

English Post: ClassNotFoundException cause and solution.

ClassNotFoundExceptionの原因はNoClassDefFoundErrorなどに比べるとわかりやすい。

ClassForNameしているところが原因なので、たいていは引数のクラス名のスペルミス。

このエラーが発生するときは、間接的にしているClassForNameを使っているケースがほとんどだろう。

一例として、web.xmlのServletやFilterの定義でクラス名が間違っているとこれまたTomcat起動時にClassNotFoundExceptionで落ちる。
その場合は以下のようなメッセージがでてTomcatのコンテキスト起動に失敗する。この場合該当Servletは利用不可能となるので、「the requested resource is not available.」の404エラーの真の原因となることも多い。

致命的: フィルタ xxxFilter の起動中の例外です
java.lang.ClassNotFoundException: com.rutake.xxxFilter

Javaソースコードでやりがちなのはパッケージ名を略して、ClassNotFoundExceptionを発生させるケース。

// パッケージ名まで含めて書かないとダメなので以下はClassNotFoundExceptionが出る
Class.forName("String").newInstance();
// これならClassNotFoundExceptionは出ない
Class.forName("java.lang.String").newInstance();

パッケージ名まで含めてクラスのスペルが正しいのならNoClassDefFoundErrorと同じ対処法でjarライブラリの中身をチェック!

チェックポイントは以下の2点

・クラスパスに該当クラスのjarが含まれているか
・そのjarファイルの中に正しくクラスが格納されているか

大概JDBCドライバーの置き忘れだったり、クラス名が変更になっていたり環境設定のミスに起因するエラーなのでわかんなかったら技術面取りまとめの人に聞いてみるべし。

カテゴリー: Java タグ: パーマリンク

コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload the CAPTCHA.