【问题标题】:NoClassDefFoundError while running from jar从 jar 运行时出现 NoClassDefFoundError
【发布时间】:2010-11-28 01:16:55
【问题描述】:

尝试在 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:异常:

线程“主”java.lang.NoClassDefFoundError 中的异常:com/hamza/gui/tr ansfer/剪贴板TransferHandle 在 com.hamza.driver.ui.main(未知来源) 引起:java.lang.ClassNotFoundException:com.hamza.gui.transfer.Clipboa rdTransferHandle 在 java.net.URLClassLoader$1.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.net.URLClassLoader.findClass(未知来源) 在 java.lang.ClassLoader.loadClass(未知来源) 在 sun.misc.Launcher$AppClassLoader.loadClass(未知来源) 在 java.lang.ClassLoader.loadClass(未知来源) 在 java.lang.ClassLoader.loadClassInternal(未知来源) ... 1 更多

ClipboardTransferHandle .class 文件存在于 jar 中。

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

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

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

【问题讨论】:

  • 您可以尝试不使用 Class-Path 属性,并检查您是否重现问题。
  • 显示准确的调用命令——比如“java -jar my.jar”。如果可能的话,链接到有问题的罐子。
  • com.hamza.gui.tr ansfer.ClipboardTransferHandle 类中的导入是什么?

标签: java jar noclassdeffounderror


【解决方案1】:

这是正在发生的问题,

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

解决方案:-

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      有一个机会,NoClassDefFoundError(我真的很讨厌这个错误 - 总是让我发疯......)没有被抛出,因为它没有找到它告诉你的类(->你的类)但是因为 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?

      【讨论】:

      • 但如果是这样的话,当我解压缩它时它不应该工作。但它有效。
      • 只是想让你知道,7 年后,你让我免于很多(更多)挫折,谢谢!
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 2013-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-28
        相关资源
        最近更新 更多