0

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

线程“主”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 文件,但我不想包含 jar 中的所有文件,因为我只需要这一类.

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

4

3 回答 3

3

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

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

于 2012-07-10T15:45:58.953 回答
2

看起来您在 class 中使用了内部类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 中包含任何内部类或其他依赖项,则此列表或类似列表应该可以解决您的问题。

于 2012-07-10T15:46:10.900 回答
1

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

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

于 2012-07-10T15:46:46.787 回答