Ant / Build a JAR:Build failed,找不到Reference task.path

时间:2015-01-08 13:57:29

标签: java xml ant jar build

我正在使用build.xml处理项目以生成JAR文件。 当我尝试构建它时,我收到此错误:

  

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

     

BUILD FAILED D:\ xxxxxtrunk \ project-java \ build.xml:25:参考   找不到task.path。

     

总时间:140毫秒

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" />

它能是什么?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

  

BUILD FAILED D:\ xxxxxtrunk \ project-java \ build.xml:25:找不到参考task.path。

那么,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会自动查找。我并不喜欢这个,因为这意味着你建立起来并不适合其他用户。机器,因为他们可能没有安装那个罐子。

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

这是我的偏好,以及我通常如何做到这一点。

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

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

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

记得我说过你需要的一件事是指定包含任务的类吗? 以下是您在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中类的任务名称映射。

答案 1 :(得分:1)

  1. 搜索整个build.xml,传递闭包 包含文件,以及字符串&#34; task.path&#34;。
  2. 的所有超级项目
  3. 如果以下表格遗失或缺失,请添加或更正表格。除了@id属性设置之外,请确保您没有尝试以某种方式识别它。

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

  5. 如果找到,但在parallel任务中也定义了相同的@id 值,完成的最后一个任务将覆盖其他参考。考虑清理一下以避免歧义。
  6. 另请参阅:Ant objects and references: what is the scope of a reference's ID?