InnerClass的Java NoClassDefFoundError

时间:2012-07-10 15:43:39

标签: java ant jar

我正在尝试从ant执行Java类。我首先为我的类创建一个jar文件,然后通过ant target执行它。但它给我这个错误:

  

线程“main”中的异常java.lang.NoClassDefFoundError:com / abc / utils / ClassName $ InnerClass

我在构建文件中创建一个jar,如下所示:

<jar destfile="${dist.dir}/../lib/jarFile.jar" basedir="${basedir}/classes" includes="com/abc/utils/ClassName.class" />

如果我在创建jar时删除了“includes”,那么一切都很好,我可以执行jar文件,但我不想在jar中包含所有文件,因为我只需要这一课。

任何想法如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

该内部类将是一个单独的文件(我认为称为ClassName$InnerClass.class),并且您在jar定义中明确排除它。

内部类将在文件系统中表现为单独的类文件。因此,仅仅包括一个.class文件将会破坏您的可部署性,因为它缺少相应的内部类。

答案 1 :(得分:2)

看起来你正在使用类ClassName中的内部类。这将生成一个单独的类文件。

由于您使用的是includes属性,因此jar任务仅包含一个类文件:ClassName.class。删除includes,所有类文件将最终放入jar中。

请注意,includes/excludes也会接受以逗号分隔或以空格分隔的列表,例如:

<jar destfile="${dist.dir}/../lib/jarFile.jar" basedir="${basedir}/classes" includes="com/abc/utils/ClassName.class,com/abc/utils/ClassName$InnerClass.class" />

如果您想在jar中仅包含ClassName以及任何内部类或其他依赖项,则此类或类似列表应解决您的问题。

答案 2 :(得分:1)

如果是内部类,可能需要执行enclosingclass$className.class,因为你的内部类将在单独的文件中创建并附加$符号。

注意:如果另一个类依赖于此类,则运行时可能会出现问题。