jar里面的NoClassDefFoundError

时间:2009-06-06 15:47:55

标签: java jar noclassdeffounderror

我有一个类,它位于一个名为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

运行它

程序的其余部分工作只会在我尝试使用该程序包时抛出异常。

4 个答案:

答案 0 :(得分:3)

Class not Found Exception应该提到它正在寻找的类的名称。

因为类路径上只有jar,所以它应该在jar中,但事实并非如此。找出原因,可能的原因:

  • 当ant构建包时,类文件不是它所属的位置
  • 表示包名称的目录结构不是以所有其他类为根的
  • 的根目录
  • 类文件所属的地方不包含在由ant放入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