2015-01-08 98 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?