- 締切済み
NoClassDefFoundErrorの解決方法
netbeansでjava.lang.NoClassDefFoundErrorの解決方法を教えて下さい。 NetBeans IDE 7.0を使ってJAVAで、「Hell World !」を表示するものを 作りました。 ソースコード public class HelloWorld { public static void main(String args[]) { System.out.println("Hello World!"); } } NetBeansで、 「実行]-「ファイルを実行」とすると、「Hello World!」と表示されます。 正しく動きます。 しかし、 「実行」-「プロジェクトを実行」とすると、以下のエラーメッセージがでます。 java.lang.NoClassDefFoundError: helloworld/HelloWorld Caused by: java.lang.ClassNotFoundException: helloworld.HelloWorld at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) Could not find the main class: helloworld.HelloWorld. Program will exit. Exception in thread "main" Java Result: 1 また、コマンドラインから以下の様に実行しても、実行してもエラーとなります。 C:\Program Files\Java\jdk1.6.0_25\bin>java.exe -jar C:\java\HelloWorld\dist\HelloWorld.jar Exception in thread "main" java.lang.NoClassDefFoundError: helloworld/HelloWord Caused by: java.lang.ClassNotFoundException: helloworld.HelloWorld at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) Could not find the main class: helloworld.HelloWorld. Program will exit. そこで、 ソースコードに、「package helloworld;」の記述を行いと期待した結果となりました。 NetBeansで、「実行」-「プロジェクトを実行」 コマンドラインから実行 しても、「Hello World!」と表示されます。 ソースコード package helloworld; public class HelloWorld { public static void main(String args[]) { System.out.println("Hello World!"); } } 何故、 「package helloworld;」の記述の追加で動いたのでしょうか。 あるとないとで、どう違うのでしょうか。 「package helloworld;」は、何を意味しているのでしょうか。 環境は、 JDK1.6(jdk1.6.0_25) クラスパスは未設定。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- red_pana
- ベストアンサー率28% (18/64)
そもそも、Javaではパッケージを命名するのが強く推奨されていると思いますが。。。。 Windowsでいうと、 パッケージがフォルダ、 クラスがファイルにあたります。 質問者様がファイル開いてって、誰かに言われたら どのフォルダのって聞きますよね? それと同じで、Javaの実行ファイルにも どのパッケージのどのクラスを最初に実行するのか教えてあげる必要があります。 さて、質問者様からの状況を見ると、 jarファイルに含まれているマニフェストファイルに、どのパッケージの、どのクラスを実行すべきか書いてありますね。 まずは、DOS窓で、「cd C:\java\HelloWorld\dist\」と入力してから 「jar xvf HelloWorld.jar」と入力してください。 (jarファイルは、圧縮ファイルみたいなものですが、このコマンドで解凍できます。) そうすると、「META-INF」ってフォルダが出ると思うんですよね。 その中にあるマニフェストファイルをテキストエディタで開くと「helloworld.HelloWorld」って記載されていると思います。 JAVAはこのマニフェストファイルを見て、最初に実行すべきクラスを決めますから、 「helloworld」ってパッケージの 「HelloWorld」ってクラスを実行すればよいと判断している事になります。 元々、「package helloworld;」って宣言が無かったので、 JAVAから見ると、「どれ実行するの???」って感じになっていましたが、 宣言を追加する事で、どのクラスを実行すべきか明確になったという事です。 また、JAVAに最初に実行するクラスはこれだと教えてあげればよいので、 「package helloworld;」の宣言を追加しなくても、 以下の方法で実行する事も可能です。 1.「java -cp HelloWorld.jar HelloWorld」として、最初に実行すべきクラスを命確認する。 2.jar内のマニフェストファイルを書き換える。
- yamada_g
- ベストアンサー率68% (258/374)
packageそのままですが、パッケージというものです。 http://www.javaroad.jp/java_package1.htm などを一度読まれてはいかがでしょうか。
お礼
ありがとうございます。 教えて頂いたURLを読んでみます。
お礼
ありがとうございます。 詳しく説明して頂きありがとうございます。 私にとってはJavaをやるのが初めてで 分からないことばかりです。 書かれていることが分からないかも知れませんが 勉強していきます。