在jar包内部出现了NoClassDefFoundError错误

4
我有一个类,位于名为com.toptur.sysTray的包中,它的作用是加载系统托盘,不使用任何外部包。我创建了一个SysTray对象来安装系统托盘。一切都构建得很好。我可以从命令行运行应用程序并安装systray。但是当我尝试从类文件创建jar并运行它时,我会收到NoClassDefFoundError错误。
包及其类文件在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运行它。

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


你如何创建jar文件并运行它? - kgiannakakis
你能展示完整的NoClassDefFound错误堆栈吗? - Michael Myers
1
你的类真的是以小写字母开头的“gotacan”吗? - Billy
删除我的回答,以便它出现在未回答的问题列表中。 - Michael Myers
嗯,这也可能是路径名称拼写的原因。你的路径中可能有大写字母,但包名只有小写字母。在Windows上,这可能仍然有效,但当东西被打包成jar文件时可能会失败。 - Jens Schauder
4个回答

3
类未找到异常应该提及它正在寻找的类的名称。
既然您只在类路径上有jar文件,那么它应该在jar文件中,但实际上并不在。请查明原因,可能的原因如下:
  • 当ant构建包时,类文件不在其所属位置
  • 表示包名的目录结构未根据其他所有类的根目录进行设置
  • ant未将类文件所属位置包含在要放入jar文件的文件列表中。
祝你好运!
注意:jar文件只是带有态度的zip文件,因此您可以使用任何zip程序来检查其中实际包含哪些文件。

他也可以直接使用命令行jar xvf toptur.jar来提取该jar文件。 - Daniel Nesbitt
返回 true(假设参数正确)的内容,但很少有人能够熟记此操作,而几乎每个开发者都知道至少使用一个压缩工具。 - Jens Schauder
请注意,单个类可以根据类的组成生成多个 .class 文件。 - Error 454

1
我猜测您的清单文件可能缺少主类指定、classpath,或者 jar 包未正确包含包目录路径。
一个 tutorial 可以帮助您。您的问题听起来很简单,可能是您忽略了一些小细节。
更新:主类的名称必须是完全解析的类名,包括完整的包路径。如果您的类在一个包中,那就是您的问题所在。

主类不在一个包中,而其他组件都在。除了这个单独的类之外,所有其他类都可以解决。所有包都在com.toptur文件夹中。 - Gotacan Toptur

0

我在为一个开源项目使用ant生成jar文件时遇到了类似的问题。

后来我联系了作者,他们建议使用eclipse导出jar文件。我按照他们的建议操作后发现,生成的jar文件大小有明显差别。虽然我没有花费时间去确定导致其中一个工作而另一个不工作的区别,但您可以尝试使用类似的过程使您的内容正常工作。如果成功了,也许您可以分享结果给我们 :)

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


0

这可能取决于您使用的JRE与构建程序和构建.exe所使用的JVM之间的匹配情况。

SysTray功能相当新(Java6),因此如果您在运行时系统路径上有一些旧的JRE或JVM,则会出现问题。

java -jar toptur.jar

它可以找到你编写的类,但无法找到它从JRE中使用的类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接