※ ChatGPTを利用し、要約された質問です(原文:クラス名正しいのにNoClassDefFound:)
NoClassDefFoundのエラーが出てしまう問題の解決方法
このQ&Aのポイント
TomcatとEclipseでwebアプリ開発を勉強している者が、コマンドの実行時にNoClassDefFoundのエラーが出てしまう問題についての質問です。
コンパイル時には成功しているのに、実行時にエラーが出る原因が分からず困っている状況です。
パッケージの指定やクラス名の間違いなどを確認しても解決できず、どこに問題があるのか理解できません。質問者は、この問題を解決する方法を教えてほしいとしています。
クラス名正しいのにNoClassDefFound:
TomcatとEclipseでwebアプリ開発を勉強している者です。
jspに持っていく前に、主要なメソッドがちゃんと動作するかどうかをテストしていましたら、
以下のように、コンパイルは出来ても実行時のコマンド結果が上手くいかず、さらに(2)のコマンド結果にも腑に落ちず、とても困ってます。。
以下が問題のコードの構成です。
・FavoriteSearch.java
package mangasearch;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
class FavoriteSearch{
public static void main(String[] args) throws IOException{
//メインメソッド
}
《コンパイル時》
C:\tomcat7\webapps\mangasearch\WEB-INF\src\mangasearch>javac -classpath C:\tomca
t7\webapps\mangasearch\WEB-INF\src FavoriteSearch.java
→成功
実行時
(1)C:\tomcat7\webapps\mangasearch\WEB-INF\src>java -classpath C:\tomcat7\webapps\ma
ngasearch\WEB-INF\src mangasearch\FavoriteSearch
↓
Exception in thread "main" java.lang.NoClassDefFoundError: mangasearch\FavoriteS
earch (wrong name: mangasearch/FavoriteSearch)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
【コマンドの動機】
・パッケージを宣言しているので、カレントディレクトリをFavoriteSearch.classがあるディレクトリより階層をひとつ上にする。
・mangasearchパッケージをsrcフォルダから探させる。
・パッケージ名をクラス名の前に\をつけ、添える。
参考サイト
http://javafaq.jp/S003.html
でjava.lang.NoClassDefFoundError:については調べたのですが、クラス名もあっていますし、どうしてこのようなエラーが出るのかが分かりません。。
(2)C:\tomcat7\webapps\mangasearch\WEB-INF\src\mangasearch>java -classpath C:\tomcat
7\webapps\mangasearch\WEB-INF\src FavoriteSearch
↓
エラー: メイン・クラスFavoriteSearchが見つからなかったかロードできませんでした
【コマンドの動機】
・カレントディレクトリにコンパイルしたFavoriteSearch.classがある。
・mangasearchパッケージをsrcフォルダから探させる。
(2)は恐らく結果的に(1)以前の問題だと思われるのですが、どこが問題なのかイマイチ分かりません。。
稚拙な質問かとは思いますが、ご教授のほど、よろしくお願いいたします。
-参考-
階層図(概略)は以下のようになります。
■tomcat7
|-■mangasearch(プロジェクトフォルダ)
|-■bin
|-■src
|-■work
|-■engine
|-■WEB-INF
|-■classes
| |-■mangasearch(パッケージフォルダ)
| → Manga.class / MangaMgr.class
|-■lib
|-■src
|-■mangasearch(パッケージフォルダ)
→ FavoriteSearch.java / FavoriteSearch.class /Manga.java / TagSearch.java /
*今はテストとしてコマンドプロンプト上でコンパイル・実行をしていますのでsrcフォルダに便宜上FavoriteSearch.classがあります。
お礼
仰っていただいたとおり、実行時(1)のコマンドクラスのパッケージは「\」 ではなく、「.」 で上手くいきました!ありがどうございます!