2015-01-08 102 views
1

我正在使用build.xml来处理项目以生成JAR文件。 当我尝试建立它,我得到这个错误:Ant /构建JAR:构建失败,未找到引用task.path

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

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

回答

1

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

嘛,哪里是在build.xml文件中定义的类路径task.path

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

  • 你需要在任务存在指定的jar文件。
  • 您需要指定包含任务的类,以及如何在jar中找到它。这可以通过以下两种方式之一完成:
    • 你说这个班级在com.foo.bar.mytask,然后给它一个名字。
    • 你终于可以指定在罐子的资源(无论是属性文件或XML文件),这几乎是说什么类与每个名称(这是resource="org/tigris/subversion/svnant/svnantlib.xml"正在做相关的。
  • ,则需要指定如何找到jar文件。

那你就错过最后一个。你指定的类路径称为一个task.path参考,但实际上并没有定义的类路径。

有几件事情可以做:

  • 你可以把水罐里的$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现在都在您的项目中。如果有人从版本控制系统中检出项目,他们会自动获取所需的任务罐。

我把我所有的可选ant任务罐放在那个目录下,然后把它们放在它们自己的目录中。

还记得我说过你需要的一件事是指定包含任务的类吗? 这里是你指定了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> 

这只是任务名称的地图到罐内类。

+0

知道了,'<路径ID = “task.path”>'被宣布之后到build.xml中。现在可以了。谢谢! – Someday

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

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

  4. 如果找到,但在parallel任务中也定义了相同的值,则最后一个要完成的任务将覆盖其他参考。考虑清理一下以避免含糊不清。

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