Ant/Build 一个 JAR:构建失败,未找到引用 task.path

Ant/Build a JAR : Build failed, Reference task.path not found

我正在使用 build.xml 开发一个项目来生成 JAR 文件。 当我尝试构建它时出现此错误:

Buildfile: D:\xxxxx\trunk\project-java\build.xml

BUILD FAILED D:\xxxxxtrunk\project-java\build.xml:25: Reference task.path not found.

Total time: 140 milliseconds

Build.xml 与它崩溃的行。

<?xml version="1.0"?>
<project name="xxxxx" default="prepare-release" basedir=".">

<property name="project.dir" value="."/>
<property file="${project.dir}/build.properties"/>
<property file="${project.dir}/svn.properties"/>

<property name="dist.dir" value="${project.dir}/dist"/>

<property name="build.dir" value="${project.dir}/build"/>
<property name="src.dir" value="${dist.dir}/${dist.type}/src"/>
<property name="release.dir" value="${project.dir}/release"/>



<!-- load svn tasks -->
// Pb on this line
<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" 
     classpathref="task.path" />

它可以是什么?感谢您的帮助。

BUILD FAILED D:\xxxxxtrunk\project-java\build.xml:25: Reference task.path not found.

嗯,在你的 build.xml 文件中定义的 class 路径 task.path 在哪里?

当您通过 <taskdef> 定义任务时,您需要做几件事:

  • 您需要指定任务所在的jar文件。
  • 您需要指定包含任务的 class,以及如何在 jar 中找到它。这可以通过以下两种方式之一完成:
    • 你说class在com.foo.bar.mytask,然后给它起个名字。
    • 您可以在 jar 中指定一个资源(属性文件或 XML 文件),这几乎说明了 class 与每个名称相关联的内容(即 resource="org/tigris/subversion/svnant/svnantlib.xml"正在做。
  • 最后,您需要指定如何找到该 jar 文件。

你错过的最后一个。您指定了对名为 task.pathclasspath 的引用,但实际上并未定义 classpath.

您可以做几件事:

  • 你可以把jar放到$ANT_HOME/lib目录下。当您通过 <taskdef/> 定义任务时,Ant 会自动查找那里。我不喜欢这个,因为这意味着你的构建不能在其他用户的机器上运行,因为他们可能没有安装那个 jar。

  • 您可以定义一个class路径来找到它。

这是我的偏好,这是我通常的做法。

<taskdef resource="org/tigris/subversion/svnant/svnantlib.xml">
    <classpath>
       <fileset dir="${basedir}/antlib/svnant}"/>
    </classpath>
</taskpath>

在您的项目中,创建一个名为 ${basedir}/antlib/svnant 的目录,并将此 SVNAnt 任务附带的所有五个 jar 放在该目录中。这样,您的可选构建任务所需的所有 jar 现在都在您的项目中。如果有人从版本控制系统签出您的项目,他们会自动获取所需的任务 jar。

我将所有可选的 ant 任务 jar 放在 ${basedir}/antlib 目录中,并将每个放在该目录中各自的目录中。

还记得我说过您需要做的一件事是指定包含任务的 class 吗?。 这是您指定的 org/tigris/subversion/svnant/svnantlib.xml 文件在 svnant.jar 中的样子:

<?xml version="1.0"?>
<antlib>
  <!-- Tasks -->
  <taskdef name="svn"
    classname="org.tigris.subversion.svnant.SvnTask" />

  <!-- Types -->
  <typedef name="svnFileSet"
    classname="org.tigris.subversion.svnant.types.SvnFileSet" />

  <!-- Selectors -->
  <typedef name="svnNormal"
    classname="org.tigris.subversion.svnant.selectors.Normal" />
  <typedef name="svnAdded"
    classname="org.tigris.subversion.svnant.selectors.Added" />
  <typedef name="svnReplaced"
    classname="org.tigris.subversion.svnant.selectors.Replaced" />
  <typedef name="svnModified"
    classname="org.tigris.subversion.svnant.selectors.Modified" />
  <typedef name="svnConflicted"
    classname="org.tigris.subversion.svnant.selectors.Conflicted" />
  <typedef name="svnIgnored"
    classname="org.tigris.subversion.svnant.selectors.Ignored" />
  <typedef name="svnUnversioned"
    classname="org.tigris.subversion.svnant.selectors.Unversioned" />
  <typedef name="svnLocked"
    classname="org.tigris.subversion.svnant.selectors.Locked" />
  <typedef name="svnMissing"
    classname="org.tigris.subversion.svnant.selectors.Missing" />
  <typedef name="svnDeleted"
    classname="org.tigris.subversion.svnant.selectors.Deleted" />

  <!-- Conditions -->
  <typedef name="svnExists"
    classname="org.tigris.subversion.svnant.conditions.Exists" />

</antlib>

它只是任务名称到 jar 中 classes 的映射。

  1. 搜索你的整个build.xml,传递闭包 包含的文件,以及字符串 "task.path".
  2. 的所有超级项目
  3. 如果缺少或不符合以下表格,请添加或更正表格。请确保您没有尝试以 @id 属性设置以外的其他方式来识别它。

    <path id="task.path">
       ...
    </path>
    
  4. 如果在超级项目中找到(通过antantcall任务调用当前项目),将inheritrefs属性设置为true 传递定义。

  5. 如果找到但在 parallel 任务中也定义了相同的 @id 值,最后完成的任务将覆盖其他的参考。考虑清理一下以避免歧义。

另请参阅:Ant objects and references: what is the scope of a reference's ID?