我有一个相当简单的程序,由 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 文件时缺少。