2012-09-30 41 views
2

我已閱讀this文章,並用它來寫我的第一個Ant任務稱爲AutoTestTask編寫我的第一個Ant任務:我錯過了什麼?

public class AutoTestTask extends org.apache.tools.ant.Task { 
    // ... 
} 

我也編譯和打包該對象到auto-test.jar

如果我的Ant的理解是正確的,那麼將它作爲另一個項目構建的一部分,我用下面的XML:

<project name="SomeProject" basedir="." default="deploy" xmlns:at="antlib:org.me.auto-test"> 
    <!-- Task definitions. --> 
    <taskdef name="at-autotest" classname="org.me.auto-test.AutoTestTask"/> 

    <!-- Use the task. --> 
    <at:autotest/> 
</project> 

相信我還需要auto-test.jar複製到我的$ { ANT_HOME}/lib目錄 - 有人可以確認嗎?令我困惑的是XML頂部的xmlns:at="antlib:org.me.auto-test"屬性,特別是antlib:<whatever>部分。這是否是某種特定於Ant的協議,它說:「* at名稱空間限定的任何內容都將在根目錄爲org.me.auto-test *」的$ {ANT_HOME}/lib中找到?如果沒有人能解釋它是什麼意思?

此外,如果我錯過了任何明顯的或有任何配置不正確,請讓我知道。提前致謝!

回答

0

好吧,它比你想象的要簡單,但你必須小心。

第一個問題是<taskdef name="at-autotest" .. />,因爲那麼您嘗試將該任務用作「at:autotest」。 「at」是xml命名空間的前綴,因此您需要在任務桌面定義的開頭放置「at-」。

第二個問題是您沒有將您的taskdef與xml命名空間「antlib:org.me.auto-test」關聯,因此您不能使用該前綴。在這個階段,你可以在<autotest/>中使用它與當前的命名空間(即沒有前綴)。但我鼓勵你指定你的所有外部任務的單獨的命名空間,所以正確的版本是:

<project name="SomeProject" basedir="." default="deploy" xmlns:at="antlib:org.me.auto-test"> 
    <!-- Task definitions. --> 
    <taskdef name="autotest" classname="org.me.auto-test.AutoTestTask" uri="antlib:org.me.auto-test"/> 

    <!-- Use the task. You can use the prefix "at:" here --> 
    <at:autotest/> 
</project> 

一對夫婦更多的事情:

  1. 這個設置迫使你把你的罐子爲任務類放入$ {ANT_HOME}/lib中。但是,您不必這樣做,如果知道位置(例如,項目根文件夾中的lib文件夾),則可以直接引用jar。你可以指定一個包含罐子類路徑<taskdef>,如(假設你已經定義的類路徑和分配的id =「autotest.classpath」):

    <!-- Task definitions. --> 
    <taskdef name="autotest" classname="org.me.auto-test.AutoTestTask" 
         uri="antlib:org.me.auto-test" classpathref="autotest.classpath" /> 
    
  2. 作爲建議由另一人在這裏,你可以打包完全在antlib中完成。與jar的唯一區別是它包含一個文件「antlib.xml」,如果這個jar已經在主類路徑中,你甚至可以跳過taskdef聲明讀取here這是「antlib:」命名空間前綴我個人不喜歡把東西放在$ {ANT_HOME}/lib中,所以我很樂意在類路徑中使用<taskdef />,但我仍然建議將你的jar打包爲antlib,並使用antlib:作爲一個名稱空間前綴,無論如何都是作爲一個慣例。

0

您正試圖將您的任務打包爲antlib。 XML文件將匹配命名空間幷包含taskdef操作。

antlibs是比較新的,這也許可以解釋爲什麼一些較舊的「如何創建ANT任務」教程沒有提及它們。

1
  1. 我不能編譯使用連字符包,所以我建議你換auto-testautotest
  2. taskdef你有at-autotest,應該是autotest
  3. xmlns聲明是XML解析器和使用antlibs 。你不需要將它們用於你的第一個螞蟻任務。所以:刪除xmlnsat:前綴。

既然你問「我錯過了什麼」,請報告你得到的錯誤信息是什麼。可能在遵循上述建議之後。

0

大部分通過擴展org.apache.tools.ant.Task來創建一個新的ant任務是矯枉過正的。
通知還有其他的方法太:
使用scriptdef用(JavaScript引擎基於犀牛1.6 JDK> = 6個附帶有自己的內置),其已經完全進入螞蟻API ieGroovy,使用Javascript
腳本語言結合,確定螞蟻內的任務。
以後要捆綁你的東西,創建一些commons.xml,其中包含所有的scriptdefmacrodef,並使用導入使其可用於其他ant腳本。

相關問題