Java 从jar运行时出现NoClassDefFoundError

Java 从jar运行时出现NoClassDefFoundError,java,jar,noclassdeffounderror,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" valu

我尝试在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中存在ClipboardTransferHandle.class文件

编辑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; 导入java.util.logging.Logger; 导入java.awt.datatransfer.Clipboard; 导入java.awt.datatransfer.ClipboardOwner; 导入java.awt.datatransfer.transfer; 导入java.awt.datatransfer.StringSelection; 导入java.awt.datatransfer.DataFlavor; 导入java.awt.datatransfer.UnsupportedFlavorException; 导入java.awt.Toolkit; 导入java.io.IOException; 在使用它的过程中,我发现如果我试图在驱动程序中将
ClipboardTransferHandle
声明为静态变量,它会工作,但是找不到每个非静态的对象。
所有主要GUI元素都是静态变量,因此GUI是构建的,而其他元素不是;所有创建的不是静态的东西都会导致NoClassDefFound,但是如果我将它们声明为静态进行测试,它们就会工作。

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

缺少哪个类?您的主类属性看起来有点可疑——com.hamza.driver.ui是类还是包?

有一种可能,没有抛出NoClassDefFoundError(我真的很讨厌这个错误-总是让我发疯……),因为它找不到它告诉您的类(->您的类)但是因为java找不到用于实例化该类的类

我曾经遇到过这个问题,当一个类从另一个jar(在我的例子中是一个OSGi包)导入了另一个没有正确导出的类时。尽管这是一个OSGi特有的问题,但您的环境中可能存在同样的问题。可能您的应用程序依赖于实际OS-X环境中存在的某些类,而不是实际窗口环境中的类。我不是看第三方库,而是看Java实现本身

祝你好运

编辑

还有两个非常相似的问题,不幸的是,没有公认的解决方案,但可能有一个提示对您的情况有帮助:

编辑2

这里有一个类似的问题,有一个公认的答案。希望这个有帮助:


这就是正在发生的问题

如果JAR文件是从“C:\java\apps\appli.JAR”加载的,并且您的清单文件具有类路径:reference“lib/other.JAR”,那么类加载器将在“C:\java\apps\lib”中查找“other.JAR”。它不会查看JAR文件条目“lib/other.JAR”

解决方案:-

  • 右键单击项目,选择导出
  • 选择Java文件夹,并在其中选择Runnable JAR文件而不是JAR文件
  • 选择适当的选项,并在库处理部分选择第三个选项,即(将所需库复制到生成的JAR旁边的子文件夹中)
  • 单击finish,您的JAR将在指定位置创建,同时还会创建一个包含清单文件中提到的JAR的文件夹
  • 打开终端,给出jar的正确路径,并使用java-jarabc.jar命令运行它

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

    这对我有用。。。希望它对你也有用


  • 您可以尝试不使用Class-Path属性,并检查是否重现了问题。显示精确的调用命令,如“java-jar my.jar”。如果可能的话,链接到有问题的jar。com.hamza.gui.tr transfer.ClipboardTransferHandle类中的导入是什么?但是如果是这样的话,解压时它就不应该工作了。但它是有效的。我只想让你知道,7年后,你让我免于很多(更多)挫折,谢谢! 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;