ant语法和规范
一、前言:
?
? ? ? ?以前在做JavaEE項目的時候曾經聽說過這個名字,但是由于沒有用到,所以也沒有去學習。最近在研究Android打包的時候,看了下build.xml文件,甚是迷糊,于是學習一下,稍有心得。
?
二、什么是ant?
? ? ? ? ant是一種基于Java的打包工具,非常類似于Linux下的makefile。ant有自己的語法和規范,通常用xml來承載。ant可以集成代碼生成、編譯、打包等功能(需要說明一下,ant本身并不具備這些功能,只是調用者),使用ant能做到編譯、打包一系列流程的自動化,就像生產流水線,一條指令,全程自動生產。
ant工具是使用Java語言編寫的,所以依賴jdk,安裝ant必須先安裝好jdk。同樣ant很多擴展的自定義的功能同樣可以使用Java編寫,后續會詳細介紹。
?
三、ant的基本語法和規范
? ? ? ? ? ??ant的構建腳本是使用xml文件承載的,缺省命名為build.xml。進入其文件所在目錄,可以在cmd中直接使用ant命令調用(前提是先配好bin目錄的環境變量)。
? ? ? ?我們先來看一下build.xml文件的基本結構:
?
[html]?view plaincopy?
?
project ? ?根標簽。name屬性表示項目名稱,沒什么作用;default屬性表示默認執行命令,cmd命令行中使用ant和ant ?default屬性值(本例是ant build) 兩種方式等效。
?
property ?定義類標簽??梢远x一些常量值,需要注意:定義后理論不能再修改(其實可以通過第三方庫修改)。比如第3行定義了一個file.dir的變量,值為”D://“,引用時使用 ${file.dir}調用。第4行,是引入一個properties文件(里面定義了很多property),相當于導包。
?
loadproperties ?引用標簽。功能和第4行<property file=""/>等同,表示引入一個properties定義集群。好處是便于封裝和管理。
?
import ?引入標簽。和loadproperties不同的是,import是引入另一個構建文件,包括變量和執行命令。
?
target ?執行標簽。可以在cmd命令行中直接ant + target執行,比如以上腳本可以執行: ant build 和 ant debug。target標簽中有個depends屬性,表示執行命令依賴。如果要執行debug命令,會自動先執行depends里面的命令。以上腳本執行 ant debug,實際是執行了 ant build 和 ant debug
?
echo ?日志標簽。表示日志輸出,能在cmd命令中打印顯示,level屬性表示:日志級別。 比較特殊的是echo中可以引用變量,用法同變量調用方式${name}。
?
?
以上就是ant最基本的語法規范,我們執行下ant debug命令看看結果。
?
?
分析以上執行過程:cmd進入build.xml所在目錄,執行target名為debug的命令,由于debug依賴于build,所以先執行build命令,打印出runing... 然后再執行debug命令下的語句,打印出D:// debugging... (注意其中引用了一個變量),執行完畢!
?
?
四、ant的常用語法
?
? ? ? ??1、文件語句
? ? ? ??文件操作是ant中最常用的基本操作,包括創建、復制、刪除、遍歷等。由于ant涉及最多的就是文件操作,所以它的api相對來說非常豐富,讓我們來逐一介紹和學習。
? ? ? ? 創建:mkdir標簽。 傳入一個文件路徑,直接創建出一個文件目錄。然而不知為何ant沒有提供創建文件的功能。
[html]?view plaincopy? ? ? ? 刪除:delete標簽。刪除文件或文件夾。
?
[html]?view plaincopy?
? ? ? ? ? ? ?移動:move標簽。包括文件重命名、文件移動、文件目錄移動。
?
?
[html]?view plaincopy
? ? ? ? ? ? ?復制:copy標簽。文件復制。
?
?
[html]?view plaincopy?
?
? ? ? ??2、條件語句
? ? ? ? ? ???condition標簽,配合istrue或者isfalse使用。
?
[html]?view plaincopy
? ? ? ??稍微解釋下以上語句:在執行名為build的target任務時,由于target中含有if的標簽,所以需要判斷名為check的條件語句的值,但是istrue=false的語句表示條件不符合,echo并不會執行。如果改成istrue=true,echo將執行。當然以上語句等價于:
? ? ? ? ? ? ? ? ?需要注意下,istrue和isfalse兩種標簽不能同時存在。
?
? ? ? ? ? 除了直接使用istrue指定條件語句的值,還能動態地使用equals比較變量,比如:
?
[html]?view plaincopy
? ? ? ??3、循環語句
? ? ? ? ant本身并沒有提供循環語句,但是我們可以借助于ant-contrib.jar使用循環語句,舉個簡單的例子:
?
?
[html]?view plaincopy ? ? ? ?以上語句稍微有些復雜,我們一句句來理。第一句property定義一個變量,即擴展jar包ant-contrib-1.0b3.jar所在的文件位置。第二句taskdef標簽,表示定義自定義名為foreach的標簽,需要引用類名和類路徑,這是使用foreach的前提條件,必須先定義好。然后我們就可以在target任務中愉快地使用for循環了。
? ? ? ?接下來我們來看foreach語句的內容,list標簽 + delimiter標簽構成循環的條件,這里是循環9次,每次循環創建一個名為number的數字變量,同時執行log任務打印一句話,結果如下:
?
? ? ? ??4、自定義語句
??? ? ? ant的魅力所在之處就是強大的自定義語句,比如上面的foreach語句。ant官方庫只定義了一些簡單的語句,但是在實際項目中遠遠不足以滿足我們的需要,比如新建一個文件。這里我們就用自定義語句來實現下。
? ? ? ? ant的原理是每個語句標簽映射一個java類文件,每個標簽里的屬性則映射java類的變量,有點類似spring中xml映射javabean。每個ant標簽映射的java類文件不是隨意編寫的,有一定的規范。
? ? ? ? 在ant安裝目錄下的lib文件目錄中有個名為ant.jar的包,這個就是ant的規范標準庫,自定義語句Java類都需要依賴它來編譯,同時每個語句必須繼承其中名為Task.java的基類,復寫execute方法執行自定義操作。
?
[java]?view plaincopy? ? ? ? ?上面定義了創建文件的自定位標簽,把這個java文件打成jar包,然后就可以在build.xml使用了,xml內容如下:
?
?
[html]?view plaincopy? ? ? ? ?以上執行的操作是創建一個路徑為D:/test.txt的文件。filecreater是映射FileCreater.java的自定義標簽,name屬性傳入文件路徑名,會自動 反射調用FileCreater.java中的setName方法注入參數值。在FileCreater.java中有個log打印輸出方法,可以在cmd中輸出,極大方便我們的調試。執行結果如下:
?
------------------------------------------------------------------------------------------------>
好了,ant相關的就先寫到這里,權當拋磚引玉^-^
?
http://blog.csdn.net/MegatronKings/article/details/48012125
轉載于:https://www.cnblogs.com/luolizhi/p/5514170.html
總結
- 上一篇: 每天一个Linux命令(17)--whe
- 下一篇: redis 简单应用