258

Oracle のJava チュートリアルの両方の例を試しました。どちらも正常にコンパイルされますが、実行時に両方とも次のエラーが発生します。

Exception in thread "main" java.lang.NoClassDefFoundError: graphics/shapes/Square
    at Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: graphics.shapes.Square
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    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:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

Main.javaファイルが間違ったフォルダにある可能性があると思います。

ディレクトリ階層は次のとおりです。

graphics
├ Main.java
├ shapes
|   ├ Square.java
|   ├ Triangle.java
├ linepoint
|   ├ Line.java
|   ├ Point.java
├ spaceobjects
|   ├ Cube.java
|   ├ RectPrism.java

そしてここにあるMain.java

import graphics.shapes.*;
import graphics.linepoint.*
import graphics.spaceobjects.*;

public class Main {
    public static void main(String args[]) {
        Square s = new Square(2, 3, 15);
        Line l = new Line(1, 5, 2, 3);
        Cube c = new Cube(13, 32, 22);
    }
}

ここで何が間違っていますか?

アップデート

Mainクラスをgraphicsパッケージに入れ(追加package graphics;した)、クラスパスを「_test」(グラフィックスを含むフォルダー)に設定し、コンパイルしてjava graphics.Main(コマンドラインから)実行すると、機能しました。

本当に遅いUPDATE #2

私はEclipse ( Notepad++と JDK のみ) を使用していませんでしたが、上記の更新で問題が解決しました。ただし、これらの回答の多くは Eclipse およびIntelliJ IDEA向けのようですが、同様の概念があります。

4

31 に答える 31

269

コードをコンパイルすると.class、プログラム内の各クラスのファイルになります。これらのバイナリ ファイルは、プログラムを実行するために Java が解釈するバイトコードです。は、クラスを動的にロードNoClassDefFoundErrorするクラスローダー (この場合は ) が、使用しようとしているクラスjava.net.URLClassLoaderのファイルを見つけられないことを示します。.class

必要なクラスが存在しない場合 (クラスがリフレクションでロードされない限り)、コードはコンパイルされないため、通常、この例外はクラスパスに必要なクラスが含まれていないことを意味します。クラスローダー (具体的にjava.net.URLClassLoaderは ) は、クラスパスの各エントリのフォルダー a/b/c/ にあるパッケージ abc 内のクラスを検索することに注意してください。NoClassDefFoundErrorまた、コンパイルして使用しようとしている .jar ファイルの推移的な依存関係が欠落していることを示している可能性もあります。

たとえば、クラスがあった場合com.example.Foo、コンパイル後にクラス ファイルが作成されますFoo.class。たとえば、作業ディレクトリが.../project/. そのクラス ファイルは に配置する必要があり.../project/com/example、クラスパスを に設定します.../project/

補足: Java および JVM 言語用に存在する素晴らしいツールを利用することをお勧めします。Eclipse や IntelliJ IDEA などの最新の IDE と、Maven や Gradle などのビルド管理ツールを使用すると、(それほど) クラスパスを気にする必要がなくなり、コードに集中できます! とはいえ、このリンクでは、コマンドラインで実行するときにクラスパスを設定する方法について説明しています。

于 2013-07-31T15:05:05.550 に答える
18

NoClassDefFoundErrorクラスが のクラスパスにCompile time存在するが、 のクラスパスには存在しないことを意味しRuntimeます。

Eclipse を使用している場合は、ファイルにshapes,linepointsおよびspaceobjectsas エントリがあることを確認してください。.classpath

于 2013-07-31T15:02:26.897 に答える
16

コンパイルおよび実行中にこれらのエラーのいずれかが発生した場合:

  • NoClassDefFoundError

  • エラー: メイン クラスの hello が見つからないか、読み込めませんでした

  • スレッド「メイン」での例外 java.lang.NoClassDefFoundError:javaTest/test/hello (間違った名前: test/hello)

    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)
    

--------------------------解決方法 -----------------------

問題は主にパッケージの編成にあります。ソースコードのパッケージ分類に関して、クラスをフォルダーに適切に配置する必要があります。

コンパイル プロセスで、次のコマンドを使用します。

javac -d . [FileName.java]

クラスを実行するには、次のコマンドを使用してください。

java [Package].[ClassName]
于 2014-10-07T11:23:51.437 に答える
10
java.lang.NoClassDefFoundError

コンパイル時に何かが見つかったが、実行時には見つからなかったことを示します。たぶん、クラスパスに追加するだけです。

于 2013-07-31T15:03:00.453 に答える
8

Java の NoClassDefFoundError:

意味:

NoClassDefFoundError は、コンパイル時にクラスが存在したが、実行時に Java クラスパスで使用できない場合に発生します。通常、NoClassDefFoundError: Exception in thread "main" java.lang.NoClassDefFoundError を取得すると、ログに次の行が表示されます。

考えられる原因:

  1. このクラスは Java クラスパスで使用できません。

  2. jar コマンドを使用してプログラムを実行していて、クラスがマニフェスト ファイルの ClassPath 属性で定義されていない可能性があります。

  3. 起動スクリプトは、クラスパス環境変数をオーバーライドしています。

  4. NoClassDefFoundError は java.lang.LinkageError のサブクラスであるため、ネイティブ ライブラリなどの依存関係の 1 つが利用できない場合にも発生する可能性があります。

  5. ログ ファイルで java.lang.ExceptionInInitializerError を確認します。静的初期化の失敗による NoClassDefFoundError は非常に一般的です。

  6. J2EE 環境で作業している場合、複数の Classloader 間での Class の可視性によっても java.lang.NoClassDefFoundError が発生する可能性があります。詳細については、例とシナリオのセクションを参照してください。

考えられる解決策:

  1. 必要なすべての Java クラスがアプリケーションのクラスパスに含まれていることを確認してください。最も一般的な間違いは、いくつかの外部ライブラリに依存する Java アプリケーションの実行を開始する前に、必要なすべてのクラスを含めないことです。

  2. アプリケーションのクラスパスは正しいですが、クラスパス環境変数はアプリケーションの実行前にオーバーライドされます。

  3. 前述の ExceptionInInitializerError がアプリケーションのスタック トレースに表示されないことを確認します。

資力:

Java J2EE で java.lang.NoClassDefFoundError を解決する 3 つの方法

java.lang.NoClassDefFoundError – No Class Def Found エラーの解決方法

于 2016-08-08T08:19:18.870 に答える
8

クラスパスに目的のクラスが見つからない場合、クラス定義なしの例外が発生します。

コンパイル時のクラス: クラスは Java コンパイラから生成されましたが、何らかの理由で実行時に依存クラスが見つかりません。

簡単な例を 1 つ見てみましょう。

public class ClassA{
    public static void main(String args[]){
         // Some gibberish code...
         String text = ClassB.getString();
         System.out.println("Text is: " + text);
    }
}

public class ClassB{
    public static String getString(){
        return "Testing some exception";
    }
}

ここで、上記の 2 つの Java ソース コードがどこかのフォルダーに配置されているとします。

シェルを開きます (Java が既に正しくセットアップされていると仮定します)。

  1. フォルダー「NoClassDefinationFoundExceptionDemo」に移動します

  2. Java ソースファイルをコンパイル javac ClassB javac ClassA

  3. 両方のファイルが正常にコンパイルされ、ClassA.class および ClassB.class と同じフォルダーにクラス ファイルが生成されます。

  4. ClassPath を現在の作業ディレクトリにオーバーライドしているため、次のコマンド java -cp を実行します。ClassA で正常に動作し、画面に出力が表示されます

  5. ここで、現在のディレクトリから ClassB.class ファイルを削除したとします。そして、もう一度コマンドを実行します。 ジャバ -cp . ClassA NoClassDefFoundException が返されます。ClassA の依存関係である ClassB がクラスパス (つまり、現在の作業ディレクトリ) に見つからないためです。

于 2015-03-22T16:28:32.180 に答える
2

この回答は、サービスで発生する java.lang.NoClassDefFoundError に固有のものです。

私のチームは最近、サービスを提供する rpm をアップグレードした後にこのエラーを確認しました。rpm とその内部のソフトウェアは Maven でビルドされていたため、rpm に含まれていないコンパイル時間の依存関係があるように見えました。

しかし調べてみると、見つからなかったクラスはスタックトレースのいくつかのクラスと同じモジュールにありました。さらに、これは最近ビルドに追加されたばかりのモジュールではありませんでした。これらの事実は、Maven の依存関係の問題ではない可能性があることを示しています。

最終的な解決策:サービスを再起動してください!

rpm のアップグレードにより、基礎となる JAR ファイルのサービスのファイル ハンドルが無効になったようです。その後、サービスはメモリにロードされていないクラスを検出し、jar ファイル ハンドルのリストからそのクラスを検索しましたが、クラスをロードできるファイル ハンドルが無効化されていたため、そのクラスを見つけることができませんでした。サービスを再起動すると、すべてのファイル ハンドルが強制的にリロードされ、rpm のアップグレード直後にメモリ内で見つからなかったクラスをロードできるようになりました。

于 2016-12-02T16:33:37.350 に答える
2

JAR ファイルからクラスを「開始」する場合は、必ず JAR のフル パスで開始してください。例 (「メイン クラス」がマニフェストで指定されていない場合):

java -classpath "./dialer.jar" com.company.dialer.DialerServer

また、他の JAR ファイルへの依存関係などの依存関係がある場合は、そのような依存関係を解決できます。

  • そのような JAR ファイル (各 JAR ファイルへのフルパス) をクラスパスに追加することによって。例えば、
java -classpath "./libs/phone.jar;./libs/anotherlib.jar;./dialer.jar" com.company.dialer.DialerServer
  • または、「依存関係 JAR ファイル」をマニフェストに追加して JAR マニフェストを編集します。このようなマニフェスト ファイルは次のようになります。
Manifest-Version: 1.0
Class-Path: phone.jar anotherlib.jar
Build-Jdk-Spec: 1.8
Main-Class: com.company.dialer.DialerServer
  • または (ソースコードを持つ開発者の場合) Maven を使用して *.pom ファイルに追加することでマニフェストを準備できます。
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>com.company.dialer.DialerServer</mainClass>
                <!-- Workaround for Maven bug #MJAR-156 (https://jira.codehaus.org/browse/MJAR-156) -->
                <useUniqueVersions>false</useUniqueVersions>
            </manifest>
        </archive>
    </configuration>
</plugin>

上記の例では、クラスパスの区切り文字として使用されていることに注意してください;(これは Windows プラットフォームで有効です)。;Linux では、に置き換え:ます。

例えば、

java -classpath ./libs/phone.jar:./libs/anotherlib.jar:./dialer.jar
com.company.dialer.DialerServer
于 2021-05-28T08:21:18.663 に答える
2

私のプロジェクトでは、問題を解決したのは、Chrome ブラウザーと chromedriver が互換性がないことでした。ブラウザーを開くことさえできない非常に古いバージョンのドライバーを使用していました。両方の最新バージョンをダウンロードしたところ、問題は解決しました。

どのようにして問題を発見したのですか? 私のアプリケーションに古いバージョンの FF が含まれている Selenium ネイティブ Firefox ドライバーを使用してプロジェクトを実行したためです。問題はブラウザーとドライバーの非互換性であることに気付きました。

これが、この同じエラーメッセージを生成した私のような同様の問題を抱えている人に役立つことを願っています.

于 2019-01-04T19:37:58.833 に答える
1

Androidスタジオを使用したAndroid開発でも同じ問題がありました。提供された解決策は一般的であり、私には役に立ちませんでした (少なくとも私にとっては)。

何時間もの調査の結果、次の解決策を見つけました。これは、Android Studio を使用して開発を行っている Android 開発者に役立つ可能性があります。

以下のように設定を変更します。

PreferencesBuild, Execution, DeploymentInstant Run → *最初のオプションのチェックを外します。

この変更により、私は稼働しています。

于 2016-04-28T17:29:43.087 に答える
0

このチェーンの私の 2 セント:

クラスパス絶対パス (/home/user/lib/some_lib.jarではなく) が含まれていることを確認してください。~/lib/some_lib.jarそうしないと、NoClassDefFoundErrorエラーが発生する可能性があります。

于 2015-06-17T15:02:50.690 に答える
0

を使用している場合はgradlew、 に移動して、適切なバージョンのGradle./gradle/wrapper/gradle-wrapper.propertiesに変更します。distributionUrl

JDK14 を使用している場合は、次を試してください。

distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip
于 2020-06-28T12:25:49.227 に答える
-2

このエラーは、依存関係の一部を追加しなかったことを意味します。

于 2021-02-07T15:24:11.503 に答える