【发布时间】: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