从jar运行时NoClassDefFoundError

时间:2009-09-14 07:22:54

标签: java jar noclassdeffounderror

我尝试在Windows上运行我的应用程序时遇到“没有找到类定义”异常(它在OS X上运行正常)。 JVM抱怨的类是我的类(不需要第三方jar)。当我解压缩jar中的文件时,所有文件都存在,包括JVMm抱怨的文件。

使用以下任务创建jar:

<target name="jar" depends="">
<jar destfile="build/app.jar" > 
  <manifest>
    <attribute name="Built-By" value="hamza"/>
    <attribute name="Main-Class" value="com.hamza.driver.ui"/>
<attribute name="Class-Path" value="./"/>
  </manifest>
  <fileset dir="build">
    <include name="**/*.class"/>
<include name="**/*.png"/>
<include name="**/*.xpi"/>
<include name="**/*.html"/>
<exclude name="**/*.jar"/>
  </fileset>
</jar>

我无法弄清楚导致问题的原因。如果我解压缩jar并从我解压缩类的目录中运行jar,一切正常。所以,我假设所有必需的文件都在jar中。

编辑:com.hamza.driver.ui是名为com.hamza.driver的程序包中的一个类main

构建之后,我得到一个jar“app.jar”,然后使用“java -jar app.jar”运行它,它在OS X上执行得很好,但在Windows上没有。

如果我在一个单独的目录中解压缩app.jar并运行“java -jar app.jar”,那就可以了。

编辑2:例外:

Exception in thread "main" java.lang.NoClassDefFoundError: com/hamza/gui/tr
ansfer/ClipboardTransferHandle
        at com.hamza.driver.ui.main(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.hamza.gui.transfer.Clipboa
rdTransferHandle
        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 java.lang.ClassLoader.loadClassInternal(Unknown Source)
        ... 1 more

ClipboardTransferHandle .class文件存在于jar中。

编辑3:剪贴板类的导入:

import java.util.logging.Logger;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.Toolkit;
import java.io.IOException;

在玩它时,我发现如果我尝试将ClipboardTransferHandle声明为驱动程序中的静态变量,它就可以工作,但是找不到每个非静态的对象。 所有主要的GUI元素都是静态变量,因此构造了GUI,但其他元素却没有;创建的所有内容都不是静态导致NoClassDefFound,但如果我将它们声明为静态以进行测试,则它们可以正常工作。

4 个答案:

答案 0 :(得分:2)

这是正在发生的问题,

如果JAR文件是从“C:\ java \ apps \ appli.jar”加载的,并且您的清单文件具有Class-Path:引用“lib / other.jar”,则类加载器将查找“C” :\ java \ apps \ lib \“for”other.jar“。它不会查看JAR文件条目“lib / other.jar”。

<强>解决方案: -

  1. 右键单击项目,选择导出。
  2. 选择Java文件夹,然后在其中选择Runnable JAR File而不是JAR文件。
  3. 选择正确的选项,然后在“库处理”部分中选择第3个选项,即(将所需的库复制到生成的JAR旁边的子文件夹中)。
  4. 单击“完成”,将在指定位置创建JAR以及包含清单文件中提到的JARS的文件夹。
  5. 打开终端,为你的jar提供正确的路径并使用此命令运行它java -jar abc.jar

    现在将发生的事情是类加载器将在引用的JARS的正确文件夹中查找,因为现在它们存在于包含您的应用程序JAR的同一文件夹中。现在没有抛出“java.lang.NoClassDefFoundError”异常

    这对我有用......希望它也适合你!!!

答案 1 :(得分:1)

缺少哪个班级?您的Main-Class属性看起来有点可疑 - com.hamza.driver.ui是一个类还是一个包?

答案 2 :(得分:1)

有一个机会,NoClassDefFoundError(我真的很讨厌这个错误 - 总是让我疯狂......)没有被抛出,因为它没有找到它告诉你的类( - &gt;你的类)但是因为java找不到用于实例化该类的类之一。

我有一次这个问题,当一个类从另一个jar(在我的情况下是一个OSGi包)中导入另一个没有正确导出的类时。虽然这是OSGi特定的问题 - 您的环境可能会遇到同样的问题。也许您的应用程序依赖于实际OS-X环境中存在的某些类,而不是实际的Window环境中的类。我不是在看第三方库,而是在Java实现本身。

祝你好运!

修改

在SO上还有两个非常相似的问题,遗憾的是没有可接受的解决方案,但也许其中一个提示可以帮助您:

NoClassDefFound when running a jar

NoClassDefFoundError inside jar

修改2

这是一个类似的问题,已经接受了答案。希望这个有所帮助:

NoClassDefFoundError while trying to run my jar with java.exe -jar...what's wrong?

答案 3 :(得分:0)

您是否在类路径中指定了新jar(java -cp .; new.jar MainClass.class)?