我有一个类,它位于一个名为com.toptur.sysTray的包中,它只是加载系统托盘,它不使用任何外部包。我创建一个SysTray对象来安装系统托盘。 Everthing构建良好。我可以从命令行运行应用程序并安装systray。但是当我尝试从类文件创建一个jar并运行它时,我得到NoClassDefFoundError。
包及其类文件在jar中,我的应用程序不使用ant外部jar。只是java提供的类。
如果从jar中构建一个.exe文件,它会再次开始工作而没有任何错误。
我如何追踪这个?
<target name="jar" depends="">
<jar destfile="build/toptur.jar" >
<manifest>
<attribute name="Built-By" value="Toptur"/>
<attribute name="Main-Class" value="gotacan"/>
</manifest>
<fileset dir="build">
<include name="**/*.class"/>
<include name="**/*.png"/>
<exclude name="**/*.jar"/>
</fileset>
</jar>
我使用上面的代码从ant目标创建jar文件。驱动程序不在包中。它位于gotacan.java
我使用java -jar toptur.jar
运行它程序的其余部分工作只会在我尝试使用该程序包时抛出异常。
答案 0 :(得分:3)
Class not Found Exception应该提到它正在寻找的类的名称。
因为类路径上只有jar,所以它应该在jar中,但事实并非如此。找出原因,可能的原因:
祝你好运
注意:jars只是一种态度的zip文件,因此您可以使用任何zip程序来检查实际存在的文件。
答案 1 :(得分:1)
我猜你的清单要么缺少主类名,类路径,要么jar不能正确包含包目录路径。
tutorial可能会有所帮助。你听起来很简单,这是你忽略的一件小事。
更新:主类的名称必须是完全解析的类名,包括完整的包。如果你的班级在一个包中,那就是你出错的地方。
答案 2 :(得分:0)
可能依赖于您运行程序的JRE与针对您使用它构建的JVM以及使用.exe创建.exe。
SysTray功能很新(Java6),所以如果你在运行时在系统路径上有一些旧的JRE或JVM
java -jar toptur.jar
它可以找到您编写的类,但不能找到它从JRE中使用的类。
答案 3 :(得分:0)
当我尝试使用ant为开源项目制作jar时,我遇到了类似的问题。
我与作者联系过,他们使用eclipse来输出jar。我模仿了他们的建议,发现了jar文件大小的明显差异。我没有花时间来确定导致一个工作而另一个工作的差异。但是,您可以使用类似的过程来使您的东西正常工作。如果是这样,也许您可以查看差异并与我们分享结果:)
以下是我的问题和解决方案的链接:Xerces-for-Android NoClassDefFoundError When Using Jar Instead of Source Code