创建jar文件后发现NoClassDefFoundError异常
我创建了一个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)
你,当你运行你的应用程序通过缺失.class文件。
java -jar -cp <path_to_missing_jars_here> yourJarName.jar
缺少的类需要放在类路径中。如何做到这一点取决于你想要如何部署/运行你的应用程序。
这些课程不缺。 JVM找到了该类文件,但该类文件具有错误的完全限定类名。 – 2012-07-14 19:30:13
我怀疑你没有正确创建你的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\ghi
内Hello.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.class
在C:\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
好吧我会解释我的情况我有一个文件夹有3个子文件夹和一个类文件,它是主要的。我该怎么做才能正确创建jar文件? – Mazzy 2012-07-14 19:39:01
@Mazzy:可以在不使用JAR文件的情况下重现错误,并且如果错误与文件不在JAR中,那么JAR可能已经被创建为OK。 (对错过这些细节抱歉。)你究竟是如何运行你的课程? JigMonitorGUI是JAR中的一个类,还是它的主类? – 2012-07-14 21:12:58
而是与java -cp whatever -jar app.jar
调用应该编辑JAR的清单文件。事情是这样的:
Manifest-Version: 1.0
Main-Class: abc.def.Whatever
Class-Path: jar1.jar jar2.jar jar3.jar
(不要忘记在清单的最后的空行...)
也没有结果...... – Mazzy 2012-07-14 18:34:19
@Mazzy尝试通过(除了常用的罐子)当前目录也是类路径。像这样:'java -jar -classpath。; jar1.jar; jar2.jar application.jar'。 – 2012-07-14 18:39:28
你能跟我们分享整个堆栈跟踪吗? – WeMakeSoftware 2012-07-14 18:48:19