我尝试在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
,但如果我将它们声明为静态以进行测试,则它们可以正常工作。
答案 0 :(得分:2)
这是正在发生的问题,
如果JAR文件是从“C:\ java \ apps \ appli.jar”加载的,并且您的清单文件具有Class-Path:引用“lib / other.jar”,则类加载器将查找“C” :\ java \ apps \ lib \“for”other.jar“。它不会查看JAR文件条目“lib / other.jar”。
<强>解决方案: - 强>
打开终端,为你的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)?