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