Ant/Build a JAR:构建失败,找不到引用任务路径



我正在处理一个带有构建的项目.xml以生成JAR文件。当我尝试构建它时,出现此错误:

构建文件: D:\xxxxx\trunk\project-java\build.xml

构建失败 D:\xxxxxtrunk\project-java\build.xml:25:参考 找不到任务路径。

总时间:140

毫秒

构建.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" />

能是什么?感谢您的帮助。

构建失败 D:\xxxxxtrunk\project-java\build.xml:25:找不到引用任务路径。

那么,类路径task.path在您的build.xml文件中定义在哪里?

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

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

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

您可以执行以下几项操作:

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

  • 您可以定义类路径来查找它。

这是我

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

<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 目录中,并将每个 ant 任务 jar 放在该目录中自己的目录中。

还记得我说过你需要做的一件事是指定包含任务的类吗?以下是您在svnant.jar中指定的org/tigris/subversion/svnant/svnantlib.xml文件的外观:

<?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 内类的任务名称映射。

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

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

  4. 如果找到,但在也定义相同@idparallel任务中值,则最后一个要完成的任务将覆盖另一个任务的引用。 考虑清理内容以避免歧义。

另请参阅:Ant 对象和引用:引用 ID 的范围是什么?