我有一个相当简单的程序,由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行包含main方法的左括号。
在我看来,像__CLR3_1_116gfw6gfwhi29d0u9是某种自动生成的内部类(我没有在代码中编写任何内部类),并且可能以某种方式编织在输入main方法的连接点,但是我不明白为什么如果明确找到班级本身就找不到任何这样的内部班级。
FWIW,如果我在eclipse中运行代码,没有问题发生,所以eclipse似乎提供了一些额外的粘合剂,当使用ant构建并运行jar文件时会丢失。
答案 0 :(得分:0)
由于内部类生成为单独的.class文件,因此您需要在jar中包含${class.dir}
下的所有内容。只需从代码段中删除<include>
行即可。