1

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

4

1 回答 1

0

由于生成内部类以分隔 .class 文件,因此您需要将所有内容都包含${class.dir}在 jar 中。只需<include>从您的代码片段中删除该行。

于 2013-06-19T18:11:17.913 回答