当我在Windows上运行应用程序时,出现“找不到类定义”的异常(在OS X上运行良好)。JVM抱怨的类是我的类(不需要第三方jar包)。当我解压缩jar文件中的文件时,所有文件都存在,包括JVM抱怨的文件。
使用以下任务创建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
。
构建后,我得到一个名为“app.jar”的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.Toolkit; import java.io.IOException;
在调试时,我发现如果我尝试在驱动程序中声明ClipboardTransferHandle
作为静态变量,则可以正常工作,但是未声明为静态的每个对象都无法找到。所有主要GUI元素都是静态变量,因此可以构建GUI,但是其他元素不行;创建的所有非静态元素都会导致NoClassDefFound
,但是如果我将它们声明为静态以进行测试,则它们可以正常工作。