【问题标题】:ANT eclipse headless build - java.lang.NoClassDefFoundErrorANT eclipse 无头构建 - java.lang.NoClassDefFoundError
【发布时间】:2016-11-26 19:44:46
【问题描述】:

我正在尝试制作一个需要 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

【问题讨论】:

  • 唯一的可能是 .jar 的路径错误,或者类名错误。 .jar 的路径是相对路径吗?如果是这样,它是否与构建文件相关?您是否为项目指定了一个备用的 basedir?您是否仔细检查了 .jar 是否包含该类?
  • 所有路径都是绝对路径。如果我错了,请纠正我,但由于任务执行但随后出现错误,我相信这意味着我的类名设置正确。我不相信我设置了备用 basedir
  • 那么 NoClassDefFoundError 不是指任务类本身?
  • 是的,它指的是一个完全在 path.to.class.with.execute 所在的 jar 之外的类。
  • 该类所依赖的任何类也需要在定义任务时提供的类路径中。任务可能使用的其他类的任何依赖项也是如此。

标签: java eclipse ant taskdef


【解决方案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>

【讨论】:

    猜你喜欢
    • 2012-11-03
    • 2014-07-23
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 2018-01-10
    相关资源
    最近更新 更多