2012-07-10 67 views
0

我想从蚂蚁执行一个Java类。我首先为我的类创建一个jar文件,然后通过ant target执行它。但它扔我这个错误:InnerClass的Java NoClassDefFoundError

Exception in thread "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文件,但我不想将所有文件包含在jar中,因为我只需要这一个类。

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

回答

3

这个内部类将是一个单独的文件(称为ClassName$InnerClass.class,我认为),而你明确排除它在你的JAR定义。

内部类将在文件系统中显示为独立的类文件。因此,不幸的是只包含一个.class文件会破坏你的可部署,因为它缺少相应的内部类。

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" /> 

这或类似的名单应该解决您的问题,如果你想只包括ClassName任何内部类或jar中的其他依赖关系。

1

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

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