我正在尝试从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中包含所有文件,因为我只需要这一课。
任何想法如何解决这个问题?
答案 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
,因为你的内部类将在单独的文件中创建并附加$符号。
注意:如果另一个类依赖于此类,则运行时可能会出现问题。