ANT eclipse无头构建 - java.lang.NoClassDefFoundError

时间:2016-07-22 19:53:06

标签: java eclipse ant taskdef

我正在尝试构建一个需要eclipse特定任务的无头构建。

为了启动ant构建文件,我使用以下命令。我是这样做的,因为我相信它允许我运行以前抱怨他们需要工作空间运行的eclipse任务。如果这是不正确/如果有更好的方法,请通知我。

我的批处理脚本:

    java -jar %EQUINOX_LAUNCHER_JAR% -application org.eclipse.ant.core.antRunner -buildfile %ANT_SCRIPT_JAR% -data %WORKSPACE_PATH%

在我的ant构建文件中,我需要定义一个任务:

<taskdef name="myTask" classname="path.to.class.with.execute"><classpath><pathelement location="path\to\dependency.jar"/></classpath></taskdef>

运行时

<myTask/>

我得到了

java.lang.NoClassDefFoundError: path/to/class/that/I/tried/to/import

1 个答案:

答案 0 :(得分:1)

您的任务代码使用的类必须位于类路径中。一种选择是在定义任务时将它们显式添加到类路径中:

<taskdef name="myTask" classname="path.to.class.with.execute">
    <classpath>
        <pathelement location="path/to/dependency.jar"/>
        <pathelement location="path/to/transitive-dependency.jar"/>
        <pathelement location="path/to/other-transitive-dependency.jar"/>
    </classpath>
</taskdef>

如果所有.jar文件都在同一目录树中,您可以将其缩短为:

<taskdef name="myTask" classname="path.to.class.with.execute">
    <classpath>
        <fileset dir="path/to/dir" includes="**/*.jar"/>
    </classpath>
</taskdef>

另一种可能性是将Class-Path属性添加到包含任务类的.jar的清单中。属性的值是以空格分隔的相对URL列表,其隐含的基础是清单所在的.jar文件。例如:

Class-Path: transitive-dependency.jar utils/other-transitive-dependency.jar

如果您在Ant中构建任务.jar本身,则可以在Ant的jar任务中指定Class-Path属性:

<jar destfile="task.jar">
    <fileset dir="classes"/>
    <manifest>
        <attribute name="Class-Path"
            value="transitive-dependency.jar utils/other-transitive-dependency.jar"/>
    </manifest>
</jar>