gpt4 book ai didi

java - 从 jar 运行时出现 NoClassDefFoundError

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:33 24 4
gpt4 key购买 nike

尝试在 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/transfer/ClipboardTransferHandle        at com.hamza.driver.ui.main(Unknown Source)Caused by: java.lang.ClassNotFoundException: com.hamza.gui.transfer.ClipboardTransferHandle        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,但如果我将它们声明为静态以进行测试,它们就会起作用。

最佳答案

这是正在发生的问题,

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

解决方案:-

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

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

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

关于java - 从 jar 运行时出现 NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1420119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com