3

尝试在 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,但是如果我将它们声明为静态以进行测试,它们就会起作用。

4

4 回答 4

2

这是正在发生的问题,

如果 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”异常。

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

于 2012-09-05T12:57:37.940 回答
1

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

于 2009-09-14T07:41:48.997 回答
1

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

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

祝你好运!

编辑

关于 SO 还有两个非常相似的问题,不幸的是没有公认的解决方案,但也许那里的提示之一可以帮助您的情况:

运行 jar 时的 NoClassDefFound

jar 内的 NoClassDefFoundError

编辑 2

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

尝试使用 java.exe -jar 运行我的 jar 时出现 NoClassDefFoundError ...怎么了?

于 2009-09-14T07:43:39.227 回答
0

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

于 2009-09-14T07:39:14.807 回答