1. ホーム
  2. java

[解決済み] java.lang.NoClassDefFoundError」を解決するにはどうすればよいですか?

2022-02-14 03:08:11

質問

オラクルの 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

を使っていたわけではありません。 エクリプス (ただ メモ帳++(プラス とJDK)、上記の更新で問題が解決しました。しかし、これらの回答の多くはEclipse用であるようですし IntelliJ IDEA しかし、両者は似たようなコンセプトを持っています。

どのように解決するのですか?

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

必要なクラスが存在しなければ、あなたのコードはコンパイルされません (クラスがリフレクションでロードされない限り)。したがって、通常この例外は、クラスパスに必要なクラスが含まれていないことを意味します。クラスローダー(特に java.net.URLClassLoader ) は、クラスパスの各エントリで a/b/c/ フォルダ内の a.b.c パッケージにあるクラスを探します。 NoClassDefFoundError は、コンパイルして使おうとしている .jar ファイルの依存関係がないことを示すこともできます。

例えば、クラス com.example.Foo で、コンパイルすると、クラスファイル Foo.class . 例えば、あなたの作業ディレクトリが .../project/ . そのクラスファイルは .../project/com/example に設定し、クラスパスを .../project/ .

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