5

私はこれに約1時間取り組んでおり、stackoverflowに関するQ&Aを詳しく調べていますが、問題に対する提案された解決策は見つかりませんでした。これが重複している場合は申し訳ありませんが、特定の問題を解決する回答のある重複する質問は見つかりませんでした。

私は初めてターミナルからJavaプログラムを作成してコンパイルしようとしています(この時点まで、JavaにはEclipseを使用し、それ以外にはVIMを使用していましたが、完全にVIMに切り替えるときが来たと感じています)。これが私の現在のHelloWorldコードです:

package main;

public class HelloWorld {
    public static void main(String args[]) {
        System.out.println("Hello World!");
    }
}

次のコマンドを使用してコンパイルおよび実行します(問題がないことを確認するためにクラスパスを指定します)。

javac -cp "./" HelloWorld.java
java -cp "./" HelloWorld

これにより、次のエラーメッセージが表示されます。

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: main/HelloWorld)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:480)

runコマンドを次のように変更すると、HelloWorld.classファイルが表示され、HelloWorldクラスにアクセスしようとしていることがわかります。

java -cp "./" Foo

まったく異なるエラーメッセージが表示されます。

Error: Could not find or load main class Foo

私は数十ページ分のトラブルシューティングを試しましたが、次のように短くなりました。

スレッド「main」の例外java.lang.NoSuchMethodError:main

http://introcs.cs.princeton.edu/java/15inout/mac-cmd.html

java -version収量:

java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) Client VM (build 23.3-b01, mixed mode)

私のオペレーティングシステムはLinuxMintで、次のようになりuname -aます。

Linux will-Latitude-D620 2.6.38-8-generic #42-Ubuntu SMP Mon Apr 11 03:31:50 UTC 2011 i686 i686 i386 GNU/Linux
4

4 に答える 4

23

パッケージメイン;

これは、クラスがmainパッケージに存在し、その正規名が。であることを意味しますmain.HelloWorld

Javaでは、パッケージ名もディレクトリ構造にミラーリングする必要があります。この意味は:

  1. ファイルHelloWorld.javaは、という名前のディレクトリにある必要がありますmain
  2. それ自体からではなく、を含むディレクトリから実行する必要がjavacありますjavamainmain
  3. クラスパスには、それ自体mainではなく、ディレクトリがあるディレクトリが含まれている必要がありますmain
  4. javaクラスの正規名が実行されることを期待しているので、main.HelloWorld

要約すると、次のようになります。

あなたは次のようなものを持っている必要がありますmyproject/main/HelloWorld.java

からmyproject、実行javac main/HelloWorld.java

からmyproject、実行java -cp ./ main.HelloWorld

于 2013-01-03T03:36:58.037 に答える
9

クラスを「main」という名前のパッケージに入れましたが、パッケージに含まれていないかのように処理しようとしています。ソースファイルの先頭に配置package main;するため、HelloWorld.javaを./mainに配置してから、を実行しjavac ./main/HelloWorld.java、続いて。を実行する必要がありますjava -cp . main.HelloWorld

これらのコマンドは、構築しようとしている実用的な例を取得します。

mkdir main
echo 'package main; public class HelloWorld { public static void main(String... args) { System.out.println("Hello World"); } }' > main/HelloWorld.java
javac main/HelloWorld.java
java -cp . main.HelloWorld
于 2013-01-03T03:30:51.680 に答える
2

初心者の場合、エラー出力が同じである非常によく似たシナリオに遭遇する可能性があります。(パッケージを設定せずに)単純なプログラムをコンパイルして実行しようとすると、次のようになります。

javac HelloWorld.java
java HelloWorld.class

これにより、JavaはHelloWorldをパッケージと見なし、クラス名をクラス化するため、同じjava.lang.NoClassDefFoundErrorが発生します。それを解決するには、

javac HelloWorld.java
java HelloWorld

Javaページを参照してください-レッスン:一般的な問題(およびその解決策)

于 2013-11-04T21:19:07.710 に答える
0

問題: 基本的に、スレッド「main」の例外java.lang.NoClassDefFoundError

つまり、実行しようとしているクラスがクラスパスに見つかりませんでした。

解決策.jar:このクラスを含むクラスまたはファイルをJavaクラスパスに追加する必要があります。コマンドラインからJavaクラスを実行している場合は、ドット(。)を追加する必要があります。

java YourSingleClass -cp .

実際のディレクトリでクラスを検索するようにJVMに指示するクラスパスに追加します。

.jarファイルからクラスを実行している場合は、次のjarファイルをクラスパスに追加する必要があります。

java org.somepackage.SomeClass -cp myJarWithSomeClass.jar
于 2013-01-03T03:28:52.607 に答える