4

我有一个类,它位于一个名为 com.toptur.sysTray 的包中,它所做的只是加载系统托盘,它不使用任何外部包。我创建一个 SysTray 对象来安装系统托盘。一切都很好。我可以从命令行运行应用程序并安装系统托盘。但是当我尝试从类文件创建一个 jar 并运行它时,我得到了 NoClassDefFoundError。

包及其类文件在我的应用程序不使用 ant 外部 jar 的 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

4 回答 4

3

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

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

  • ant构建包时class文件不在它所属的位置
  • 表示包名的目录结构没有根植于所有其他类的根
  • 类文件所在的地方不包含在ant放入jar的文件列表中。

祝你好运

注意:jar 只是带有态度的 zip 文件,因此您可以使用任何 zip 程序来检查其中实际包含哪些文件。

于 2009-06-06T16:28:27.370 回答
1

我猜你的清单要么缺少主类名称、类路径,要么 jar 没有正确包含包目录路径。

教程可能会有所帮助。你的听起来很简单,因为这是你忽略的一件小事。

更新:主类的名称必须是完全解析的类名,包括完整的包。如果您的课程在一个包中,那就是您出错的地方。

于 2009-06-06T15:52:35.003 回答
0

可能取决于您运行程序的 JRE 与您使用它来构建和构建 .exe 的 JVM。

SysTray 功能是相当新的(Java6),所以如果您在运行时系统路径上有一些旧的 JRE 或 JVM

java -jar toptur.jar

它可以找到您编写的类,但不能从 JRE 中找到它使用的类。

于 2009-06-06T19:03:14.453 回答
0

当我尝试使用 ant 为开源项目制作 jar 时,我遇到了类似的问题。

我与作者取得了联系,他们使用 eclipse 来导出 jar。我模仿了他们的建议,发现 jar 文件的大小存在明显差异。我没有花时间来确定导致一个工作而另一个不工作的差异。但是,您可以使用类似的过程来使您的东西正常工作。如果是这样,也许您可​​以看看差异并与我们分享结果:)

以下是我的问题和解决方案的链接:Xerces-for-Android NoClassDefFoundError When Using Jar instead of Source Code

于 2013-09-19T15:43:22.650 回答