重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【6/2終了】教えて!goo新規会員登録

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)
クラスパスは未設定。

A 回答 (2件)

そもそも、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内のマニフェストファイルを書き換える。
    • good
    • 0
この回答へのお礼

ありがとうございます。
詳しく説明して頂きありがとうございます。

私にとってはJavaをやるのが初めてで
分からないことばかりです。
書かれていることが分からないかも知れませんが
勉強していきます。

お礼日時:2011/05/24 09:03

packageそのままですが、パッケージというものです。


http://www.javaroad.jp/java_package1.htm
などを一度読まれてはいかがでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございます。
教えて頂いたURLを読んでみます。

お礼日時:2011/05/24 08:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!