【问题标题】:NoClassDefFoundError for inner class upon trying to enter main尝试进入 main 时内部类的 NoClassDefFoundError
【发布时间】:2013-06-19 17:04:35
【问题描述】:

我有一个相当简单的程序,由 ant 使用基本的 jar 任务构建。此任务是从 build.xml 文件中的现有任务复制和修改的,用于另一个运行良好的程序。新任务如下所示:

<jar jarfile="${dist.dir}/CheckSiteProperties.jar">
   <fileset dir="${class.dir}">
      <include name="path/to/class/CheckSiteProperties.class" />
   </fileset>
   <manifest>
      <attribute name="Main-Class" value="path.to.class.CheckSiteProperties"/>
      <attribute name="Class-Path" value="CheckSiteProperties.jar" />
   </manifest>
</jar>

当我尝试使用以下方式运行程序时:

java -jar CheckSiteProperties.jar

我得到错误:

Exception in thread "main" java.lang.NoClassDefFoundError: path/to/class/CheckSiteProperties$__CLR3_1_116gfw6gfwhi29d0u9
    at path.to.class.CheckSiteProperties.main(CheckSiteProperties.java:29)
Caused by: java.lang.ClassNotFoundException: path.to.class.CheckSiteProperties$__CLR3_1_116gfw6gfwhi29d0u9

CheckSiteProperties.java 中的第 29 行包含主方法的左大括号。

在我看来 __CLR3_1_116gfw6gfwhi29d0u9 是某种自动生成的内部类(我没有在代码中编写任何内部类)并且可能以某种方式编织在进入 main 方法的连接点,但是我不明白如果明显找到了类本身,为什么找不到任何这样的内部类。

FWIW,如果我在 Eclipse 中运行代码,则不会出现任何问题,因此 Eclipse 似乎提供了一些额外的胶水,这些胶水在使用 ant 构建和运行 jar 文件时缺少。

【问题讨论】:

  • 有什么理由不将 ${class.dir} 中的所有内容都包含在 jar 中吗?看看那里,看看你的 __CLR3_1_116gfw6gfwhi29d0u9 类是否存在。
  • 正确;内部类在编译后位于单独的类文件中。
  • 我不能包含整个 ${class.dir} - 它还包含其他程序类。无论出于何种原因,我以前没有注意到内部类在 classes 文件夹中创建了单独的 .class 文件。 (我一定会记住这一点的!)所以我能够更改包含以查找 CheckSiteProperties*.class 来获取内部类。 (我还发现内部类的创建是由于之前对 clover 进行代码覆盖的一些实验,无论如何我都不希望在交付的代码中出现这种情况,所以当我在构建中关闭 clover 时,内部类也会消失.)

标签: java ant noclassdeffounderror


【解决方案1】:

由于生成内部类以分隔 .class 文件,因此您需要将 ${class.dir} 下的所有内容包含在 jar 中。只需从您的代码 sn-p 中删除 &lt;include&gt; 行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2010-09-13
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    相关资源
    最近更新 更多