2012-07-14 67 views
2

我创建了一个jar文件,其中包含一些包和一对文件。此类文件使用其他包,我还没有在jar文件包括 - 我认为这是我得到这个异常的原因:创建jar文件后发现NoClassDefFoundError异常

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) 

回答

1

你,当你运行你的应用程序通过缺失.class文件。

java -jar -cp <path_to_missing_jars_here> yourJarName.jar 
+0

也没有结果...... – Mazzy 2012-07-14 18:34:19

+0

@Mazzy尝试通过(除了常用的罐子)当前目录也是类路径。像这样:'java -jar -classpath。; jar1.jar; jar2.jar application.jar'。 – 2012-07-14 18:39:28

+0

你能跟我们分享整个堆栈跟踪吗? – WeMakeSoftware 2012-07-14 18:48:19

0

缺少的类需要放在类路径中。如何做到这一点取决于你想要如何部署/运行你的应用程序。

+0

这些课程不缺。 JVM找到了该类文件,但该类文件具有错误的完全限定类名。 – 2012-07-14 19:30:13

5

我怀疑你没有正确创建你的JAR文件。你的类文件有一个包,但是你似乎试图运行不在与类的包匹配的目录结构中的类。

让我们来演示如何重现此错误消息。假设我们有以下类:

package abc.def.ghi; 

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

请注意,这个类是在包abc.def.ghi。假设我们在一个目录C:\Users\Luke\Java这个保存为Hello.java,然后从这个目录进行编译:使用Hello.class文件

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

然后,我们创建一个JAR文件:

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期望的,所以它引发了一个错误。

如果我们不是有子目录abc\def\ghiHello.java,匹配其包装abc.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 

编辑:有可能通过直接运行类重现同样的错误,而无需创建一个JAR。关键还是你试图从与其层次结构匹配的目录结构之外运行该类。

在这一点上我有Hello.classC:\Users\Luke\JavaC:\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 
+0

好吧我会解释我的情况我有一个文件夹有3个子文件夹和一个类文件,它是主要的。我该怎么做才能正确创建jar文件? – Mazzy 2012-07-14 19:39:01

+0

@Mazzy:可以在不使用JAR文件的情况下重现错误,并且如果错误与文件不在JAR中,那么JAR可能已经被创建为OK。 (对错过这些细节抱歉。)你究竟是如何运行你的课程? JigMonitorGUI是JAR中的一个类,还是它的主类? – 2012-07-14 21:12:58

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 

(不要忘记在清单的最后的空行...)