2

その中にいくつかのパッケージとファイルのペアを含むjarファイルを作成しました。このクラス ファイルは、jar ファイルに含めなかった別のパッケージを使用しています。これが、この例外が発生する理由だと思います。

Exception in thread "main" java.lang.NoClassDefFoundError: JigMonitorGUI (wrong name: org/w3c/jigmonitor/JigMonitorGUI)

この問題を解決するにはどうすればよいですか?

編集

スタックトレース全体:

Exception in thread "main" java.lang.NoClassDefFoundError: JigMonitorGUI (wrong name:  org/w3c/jigmonitor/JigMonitorGUI)
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)
4

4 に答える 4

6

JAR ファイルが正しく作成されていないと思われます。あなたのクラス ファイルにはパッケージがありますが、クラスのパッケージと一致するディレクトリ構造内ではないクラスを実行しようとしているようです。

このエラー メッセージを再現する方法のデモを提供しましょう。次のクラスがあるとします。

package abc.def.ghi;

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

このクラスはパッケージに含まれていることに注意してくださいabc.def.ghiHello.javaこれをディレクトリに保存しC:\Users\Luke\Java、このディレクトリからコンパイルするとします。

C:\Users\Luke\Java>javac Hello.java

次に、ファイルを使用して JAR ファイルを作成しHello.classます。

C:\Users\Luke\Java>jar cf test.jar Hello.class

最後に、JAR 内からこのクラスを実行しようとします。

C:\Users\Luke\Java>java -cp test.jar Hello
Exception in thread "main" java.lang.NoClassDefFoundError: Hello (wrong name: abc/def/ghi/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)
        ...

これはあなたが得ているエラーですが、クラス名が異なります。

問題は、クラスHelloがそのパッケージに一致するディレクトリ構造内でコンパイルされていないことです。JVM は JAR のルートでクラスを検出したため、クラス ファイル内のクラスの完全修飾名はHello. ただし、クラス ファイル内の完全修飾名は でabc.def.ghi.Helloあり、JVM が予期していたものではなかったため、エラーがスローされました。

代わりに、そのパッケージに一致するHello.javaサブディレクトリ内にある場合、物事はもう少しうまく機能します:abc\def\ghiabc.def.ghi

C:\Users\Luke\Java>javac abc\def\ghi\Hello.java

C:\Users\Luke\Java>jar cf test.jar abc\def\ghi\Hello.class

C:\Users\Luke\Java>java -cp test.jar abc.def.ghi.Hello
Hello

EDIT : JAR を作成せずにクラスを直接実行することで、同じエラーを再現することができます。重要な点は、階層に一致するディレクトリ構造の外部からクラスを実行しようとしているということです。

この時点で、私は と を持ってHello.classC:\Users\Luke\JavaますC:\Users\Luke\Java\abc\def\ghi:

C:\Users\Luke\Java>java Hello
Exception in thread "main" java.lang.NoClassDefFoundError: Hello (wrong name: abc/def/ghi/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)
        ...

C:\Users\Luke\Java>java abc.def.ghi.Hello
Hello
于 2012-07-14T19:26:58.543 に答える
1

アプリケーションを実行するときに、欠落している.classファイルを渡す必要があります。

java -jar -cp <path_to_missing_jars_here> yourJarName.jar
于 2012-07-14T18:26:58.233 に答える
1

で呼び出す代わりにjava -cp whatever -jar app.jar、jar のマニフェスト ファイルを編集する必要があります。このようなもの:

Manifest-Version: 1.0
Main-Class: abc.def.Whatever
Class-Path: jar1.jar jar2.jar jar3.jar

(そして、マニフェストの最後にある空の行を忘れないでください...)

于 2012-07-14T19:30:48.783 に答える
0

欠落しているクラスはクラスパス上にある必要があります。これを行う方法は、アプリケーションをどのようにデプロイ/実行するかによって異なります。

于 2012-07-14T18:28:26.163 に答える