- - PR -
java.lang.NoClassDefFoundErrorの解決方法について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-07-26 08:02
java.lang.NoClassDefFoundErrorが発生してしまい困っています。
CLASSPATHは通っていて、コンパイル時は問題ないのに、 実行時にエラーが発生してしまいます。 たくさんのjarをCLASSPATHに設定しているので、 jar同士が競合を起こしているのかもしれないのですが、 エラーが発生するクラスは一つしかjarに格納されてありませんでした。 たとえば、 a.jarの中身 aaa.bbb.ccc.DDD b.jarの中身 aaa.bbb.DDD という2つのjarをCLASSPATHに設定している場合、 b.jarを先に設定していると、aaa.bbb.ccc.DDDを呼び出す時、 先にb.jarを先に見てしまい、aaa.bbbの下にcccパッケージが見つからないため、 エラーを起こすなんて現象はあり得るのでしょうか? 詳しいかた、教えてください。 jarを解凍してクラスファイルにしたり、eclipseからjar呼び出しの 優先順位を変更したりしてみましたが、結果は変わりませんでした。 | ||||
|
投稿日時: 2007-07-26 09:01
CLASSPATHが通っていないのでは、
と思います。 どんなに通っていると思っても こういうい場合 やっぱり通っていなかった というオチが付くのがほとんどです。 同じクラス名のクラスはありえます。 利用している箇所でどのパッケージのクラスかわからない場合は 明示的にパッケージを明確に指定する必要があるでしょうが NoClassDefFoundErrorの原因ではないでしょう。 | ||||
|
投稿日時: 2007-07-26 09:01
CLASSPATHが通っていないのでは、
と思います。 どんなに通っていると思っても こういうい場合 やっぱり通っていなかった というオチが付くのがほとんどです。 同じクラス名のクラスはありえます。 利用している箇所でどのパッケージのクラスかわからない場合は 明示的にパッケージを明確に指定する必要があるでしょうが NoClassDefFoundErrorの原因ではないでしょう。 | ||||
|
投稿日時: 2007-07-26 09:04
どうやって起動しているのかを書きましょう。
javaコマンドから直接起動しているのですか? Tomcatなどのアプリケーションサーバからですか? エラーで名前が出ているクラスが直接の原因ではなく、 そのクラスが依存しているクラスにある場合も多いです。 Tomcatなどを使っている場合では、 実行時には複数に階層分けされたクラスローダを使うため、 コンパイル時のフラットな構成と結果が異なる場合があります。
特殊なクラスローダを使わない限りありません。 | ||||
|
投稿日時: 2007-07-26 09:48
クラス名はコードを書く際、パッケージ名+単純名で構成されていますが、
内部で扱われる正式なクラス名はパッケージ名+単純名が正式名となります。 従ってパッケージが違えばそれぞれ別々のクラスです。 単純名が同じだからということはありえません。 | ||||
|
投稿日時: 2007-07-26 10:20
あすか様、あしゅ様、かつのり様ご回答ありがとうございます。
あすか様 >明示的にパッケージを明確に指定する必要があるでしょうが・・・ 問題になっている開発環境、実行環境ではクラス名がまったく同じものは ありませんでした。あすか様のおっしゃるとおり、これが原因ではないのでしょうね。 あしゅ様 >どうやって起動しているのかを書きましょう。 説明足らずで申し訳ありませんでした。 開発環境はjava1.5.0_12、tomcat5.5、eclipse3.2.0です。 他にSeasar2というJavaフレームワークを使用しています。 (使用している機能としてはTeedaとDaoです。) 実行環境は2つ確認しています。 一つはeclipse上で、もう一つはtomcatのタスクバー常駐アイコンからの サービス起動です。 javaコマンドから実行すると問題なく動作するのですが、 tomcatからの実行では、エラーが発生するという感じです。 >特殊なクラスローダを使わない限りありません。 Seasar2が少し怪しい気がするのですが、、、 問題のjarはシェアウェア製品の為、残念ですが公開できません。 Tomcatから単純なサーブレットアプリを作成して、それが動作するかためしてみます。 かつのり様 >単純名が同じだからということはありえません。 一つの疑いが晴れました。ご回答ありがとうございます。 以上、よろしくお願い致します。 | ||||
|
投稿日時: 2007-07-26 10:27
Tomcatは環境変数「CLASSPATH」の設定を無視したはず。 長いことここら辺触らなくなっているので、変わっていなければですが。 | ||||
|
投稿日時: 2007-07-26 10:54
無視するというよりは、起動シェルの中で再定義している、ですね。
実行時にはTomcat配下のどこかの共有libか、webapp配下のlibへ配置しないと。 [ メッセージ編集済み 編集者: mio 編集日時 2007-07-26 10:56 ] |