- PR -

java.lang.NoClassDefFoundErrorの解決方法について

投稿者投稿内容
未記入
会議室デビュー日: 2005/08/28
投稿数: 6
投稿日時: 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呼び出しの
優先順位を変更したりしてみましたが、結果は変わりませんでした。

あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2007-07-26 09:01
CLASSPATHが通っていないのでは、
と思います。
どんなに通っていると思っても
こういうい場合
やっぱり通っていなかった
というオチが付くのがほとんどです。

同じクラス名のクラスはありえます。
利用している箇所でどのパッケージのクラスかわからない場合は
明示的にパッケージを明確に指定する必要があるでしょうが
NoClassDefFoundErrorの原因ではないでしょう。
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2007-07-26 09:01
CLASSPATHが通っていないのでは、
と思います。
どんなに通っていると思っても
こういうい場合
やっぱり通っていなかった
というオチが付くのがほとんどです。

同じクラス名のクラスはありえます。
利用している箇所でどのパッケージのクラスかわからない場合は
明示的にパッケージを明確に指定する必要があるでしょうが
NoClassDefFoundErrorの原因ではないでしょう。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-07-26 09:04
どうやって起動しているのかを書きましょう。
javaコマンドから直接起動しているのですか?
Tomcatなどのアプリケーションサーバからですか?

エラーで名前が出ているクラスが直接の原因ではなく、
そのクラスが依存しているクラスにある場合も多いです。

Tomcatなどを使っている場合では、
実行時には複数に階層分けされたクラスローダを使うため、
コンパイル時のフラットな構成と結果が異なる場合があります。

引用:

未記入さんの書き込み (2007-07-26 08:02) より:
b.jarを先に設定していると、aaa.bbb.ccc.DDDを呼び出す時、
先にb.jarを先に見てしまい、aaa.bbbの下にcccパッケージが見つからないため、
エラーを起こすなんて現象はあり得るのでしょうか?


特殊なクラスローダを使わない限りありません。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-07-26 09:48
クラス名はコードを書く際、パッケージ名+単純名で構成されていますが、
内部で扱われる正式なクラス名はパッケージ名+単純名が正式名となります。
従ってパッケージが違えばそれぞれ別々のクラスです。
単純名が同じだからということはありえません。
未記入
会議室デビュー日: 2005/08/28
投稿数: 6
投稿日時: 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から単純なサーブレットアプリを作成して、それが動作するかためしてみます。

かつのり様
>単純名が同じだからということはありえません。
一つの疑いが晴れました。ご回答ありがとうございます。

以上、よろしくお願い致します。
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2007-07-26 10:27
引用:

未記入さんの書き込み (2007-07-26 10:20) より:
javaコマンドから実行すると問題なく動作するのですが、
tomcatからの実行では、エラーが発生するという感じです。


 Tomcatは環境変数「CLASSPATH」の設定を無視したはず。
長いことここら辺触らなくなっているので、変わっていなければですが。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2007-07-26 10:54
無視するというよりは、起動シェルの中で再定義している、ですね。
実行時にはTomcat配下のどこかの共有libか、webapp配下のlibへ配置しないと。

[ メッセージ編集済み 編集者: mio 編集日時 2007-07-26 10:56 ]

スキルアップ/キャリアアップ(JOB@IT)