一,、概述 ant 是一個(gè)將軟件編譯,、測試、部署等步驟聯(lián)系在一起加以自動化的一個(gè)工具,,大多用于Java環(huán)境中的軟件開發(fā),。在實(shí)際軟件開發(fā)中,有很多地方可以用到ant,。 開發(fā)環(huán)境: System:Windows JDK:1.6+ IDE:eclipse ant:1.9.1 Email:[email protected] Blog:http://blog.csdn.net/IBM_hoojo http://hoojo.cnblogs.com/ 二,、優(yōu)點(diǎn) ant 是Apache軟件基金會JAKARTA目錄中的一個(gè)子項(xiàng)目,它有以下的優(yōu)點(diǎn): 1,、跨平臺性:Ant是純Java語言編寫的,,所以具有很好的跨平臺性。 2,、操作簡單:Ant是由一個(gè)內(nèi)置任務(wù)和可選任務(wù)組成的,,用ant任務(wù)就像是在dos中寫命令行一樣,。Ant運(yùn)行時(shí)需要一個(gè)XML文件(構(gòu)建文件),。 Ant通過調(diào)用target樹,就可以執(zhí)行各種task,。每個(gè)task實(shí)現(xiàn)了特定接口對象,。 3、維護(hù)簡單,、可讀性好,、集成簡單:由于Ant構(gòu)建文件 時(shí)XML格式的文件,所以很容易維護(hù)和書寫,,而且結(jié)構(gòu)很清晰,。Ant可以集成到開發(fā)環(huán)境中。由于Ant的跨平臺性和操作簡單的特點(diǎn),,它很容易集成到一些開發(fā)環(huán)境中去,。 三、安裝和配置 1、下載ant,,http://mirror./apache//ant/binaries/apache-ant-1.9.1-bin.zip 2,、解壓zip壓縮包,將壓縮包放置你要放置的目錄,。我這里放置在D:\apache-ant-1.9.1,,目錄結(jié)構(gòu)如下: bin是ant的程序運(yùn)行入口,如果沒有配置ANT_HOME的情況下,,可以通過bin目錄中的bat程序進(jìn)行運(yùn)行build任務(wù),。 如:在cmd中運(yùn)行ant.bat就可以執(zhí)行程序,當(dāng)然你選擇要當(dāng)前目錄中存在一個(gè)build.xml(build.xml是默認(rèn)的ant執(zhí)行文件,,當(dāng)然你可以指定其他文件) etc目錄中存放的都是一些xsl的輸出模板,,創(chuàng)建一個(gè)加強(qiáng)的導(dǎo)出各種任務(wù)的XML輸出,使你的build文件擺脫過時(shí)的警告 lib目錄中存放的是ant程序需要依賴的jar包 manual目錄是ant程序的幫助文檔 3,、在我的電腦 –> 右鍵屬性 –> 高級系統(tǒng)配置 -> 環(huán)境變量 中配置ant 新建系統(tǒng)變量 ANT_HOME = D:\apache-ant-1.9.1 這樣環(huán)境變量就配置好了,,但前提你需要配置jdk的環(huán)境變量。如果你沒有配置jdk的環(huán)境變量,,那么請你先配置好jdk變量,。jdk環(huán)境配置方法如下: (1),安裝JDk到其默認(rèn)目錄:C:\Program Files\Java\jdk1.5.0_05 (沒有jdk去官方下載一個(gè)) C:\Program Files\Java\jdk1.5.0 作用:告訴系統(tǒng)JVM在什么地方 (2),,右擊我的電腦,,選屬性,高級,,環(huán)境變量 (3),,在系統(tǒng)變量欄點(diǎn)新建,出現(xiàn)新建系統(tǒng)變量對話框,,在變量名中填上JAVA_HOME ,變量值:C:\Program Files\Java\jdk1.5.0_05 (4),,確定后在系統(tǒng)變量(S)欄再新建一個(gè)環(huán)境變量CLASSPATH,變量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar(開頭的dot和;不能少) (5),確定后在系統(tǒng)變量(S)欄查找并選中變量為Path的選項(xiàng),,點(diǎn)編輯在變量值(V)的末尾添加: %JAVA_HOME%\bin 如果沒有找到PATH變量,,自己新建一個(gè)! 如果你不想每次運(yùn)行都要cmd到class所在目錄然后執(zhí)行java命令,,可以把所有的class文件放到統(tǒng)一的目錄組織下,,然后將此目錄也追加到CLASSPATH下。 測試代碼如下: public class Test { public static void main(String[] args) { System.out.println("Hello World!"); } } 用記事本編輯后存為Test.java(文件名與類名相同)文件,,打開命令行窗口,, cd到文件所在目錄下: javac Test.java //編譯命令 java Test //執(zhí)行程序 如果輸出為:Hello World! OK,配置完畢,否則,,重新檢查,。 四、測試ant 在啟動,運(yùn)行cmd的dos窗口中輸入ant,,如圖: 如果出現(xiàn)這個(gè),,那么恭喜你安裝成功了!否則就失敗了,,檢查下前面的步驟有沒有錯誤,。上面命令會執(zhí)行ant程序,ant默認(rèn)執(zhí)行build.xml中的任務(wù),,這里在Administrator目錄中沒有這個(gè)文件,。 如果安裝失敗,你看看是否存在一些情況: 1,、沒有配置JAVA_HOME 或配置錯誤,,并且JAVA_HOME\bin\java.exe存在 2、沒有配置ANT_HOEM 或配置錯誤,,并且ANT_HOME\bin\ant.bat存在 3,、檢查你的環(huán)境變量的path變量中,有木有配置...;%ANT_HOME%\bin;... %PATH%=...maybe-other-entries...;%ANT_HOME%\bin;...maybe-other-entries...
五,、ant的運(yùn)行時(shí)環(huán)境 ant在運(yùn)行命令的時(shí)候,,有時(shí)候會出現(xiàn)一些公園的jar庫。這些庫會存在于每個(gè)ant工程中,,那么這個(gè)時(shí)候我們可以把這個(gè)jar包放到ant_home\lib目錄中作為全局的庫使用,。 如果你不想“污染”原始的ant程序,那么你可以把jar包放在當(dāng)前windows用戶的目錄下,,具體位置應(yīng)該是${user.home}/.ant/lib 下,。沒有以上目錄可以手動建立。 如果你只是臨時(shí)要添加lib,,又不想把lib添加到當(dāng)前ant工程中,。你可以在運(yùn)行ant程序的時(shí)候指定依賴的lib參數(shù)。 同時(shí),,你還可以在當(dāng)前build工程的classpath目錄中添加你的工程依賴jar包,。 六、ant命令 語法元素說明如下: -help 顯示描述ant 命令及其選項(xiàng)的幫助信息 -projecthelp 顯示包含在構(gòu)建文件中的,、所有用戶編寫的幫助文檔。即為各個(gè)<target>中description 屬性的文本,,以及包含在<description>元素中的任何文本,。將有description 屬性的目標(biāo)列為主目標(biāo)(Main target),沒有此屬性的目標(biāo)則列為子目標(biāo)(Subtarget),。 -version 要求ant 顯示其版本信息,,然后退出。 -quiet 抑制并非由構(gòu)建文件中的echo 任務(wù)所產(chǎn)生的大多數(shù)消息。 -verbose 顯示構(gòu)建過程中每個(gè)操作的詳細(xì)消息,。此選項(xiàng)與-debug 選項(xiàng)只能選其一,。 -debug 顯示Ant 和任務(wù)開發(fā)人員已經(jīng)標(biāo)志為調(diào)試消息的消息。此選項(xiàng)與-verbose 只能選其一,。 -emacs 對日志消息進(jìn)行格式化,,使它們能夠很容易地由Emacs 的shell 模式(shellmode)所解析;也就是說,,打印任務(wù)事件,,但并不縮排,在其之前也沒有[taskname],。 -logfile filename 將日志輸出重定向到指定文件,。 -logger classname 指定一個(gè)類來處理Ant 的日志記錄。所指定的類必須實(shí)現(xiàn)了org.apache.tools.ant.BuildLogger 接口,。 -listener classname 為Ant 聲明一個(gè)監(jiān)聽類,,并增加到其監(jiān)聽者列表中。在Ant與IDE或其他Java程序集成時(shí),,此選項(xiàng)非常有用,。可以閱讀第六章以了解有關(guān)監(jiān)聽者的更多信息,。必須將所指定的監(jiān)聽類編寫為可以處理Ant 的構(gòu)建消息接發(fā),。 -buildfile filename 指定Ant 需要處理的構(gòu)建文件。默認(rèn)的構(gòu)建文件為build.xml,。 -Dproperty=value 在命令行上定義一個(gè)特性名-值對,。 -find filename 指定Ant 應(yīng)當(dāng)處理的構(gòu)建文件。與-buildfile 選項(xiàng)不同,,如果所指定文件在當(dāng)前目錄中未找到,,-find 就要求Ant 在其父目錄中再進(jìn)行搜索。這種搜索會繼續(xù)在其祖先目錄中進(jìn)行,,直至達(dá)到文件系統(tǒng)的根為止,,在此如果文件還未找到,則構(gòu)建失敗,。 -atuoproxy jdk1.5以上的可以使用代理設(shè)置 -nouserlib 運(yùn)行ant時(shí)不使用用戶lib中的jar包 -nice 設(shè)計(jì)主線程優(yōu)先級 -logfile 使用指定的log日志 -noinput 不允許交互輸入 -keep-going, -k 執(zhí)行不依賴于所有目標(biāo) -propertyfile 加載所有屬性配置文件 -d 屬性文件優(yōu)先 <project default="all"> <property name="pro_a" value="a value" /> <property name="pro_b" value="b value" /> <path id="rt.path"> <pathelement location="${java.home}/jre/lib/rt.jar" /> </path> <target name="all"> <javac srcdir="."> <classpath refid="a.path" /> </javac> </target> </project>
注意: ● 所有構(gòu)建文件都要有<project>元素,,而且至少有一個(gè)<target> 元素。
● 對于<project> 元素的default 屬性并不一定需要默認(rèn)值,。
● 構(gòu)建文件并不一定要被命名為build.xml,。不過build.xml 是ant 要搜索的默認(rèn)文件名。
● 每個(gè)構(gòu)建文件只能有一個(gè)<project> 元素,。
在cmd窗口中進(jìn)入到當(dāng)前build.xml目錄
ant 在當(dāng)前目錄下的build.xml運(yùn)行Ant,,執(zhí)行缺省的target,。
ant -buildfile build-test.xml 在當(dāng)前目錄下的build-test.xml運(yùn)行Ant,執(zhí)行缺省的target,。
ant -buildfile build-test.xml clean 在當(dāng)前目錄下的build-test.xml運(yùn)行Ant,,執(zhí)行一個(gè)叫做clean的target。
ant -buildfile build-test.xml -Dbuild=build/classes clean 在當(dāng)前目錄下的build-test.xml運(yùn)行Ant,,執(zhí)行一個(gè)叫做clean的target,,并設(shè)定build屬性的值為build/classes。
七,、ant腳本:使用節(jié)點(diǎn),、元素和屬性、命令指令
1,、project 節(jié)點(diǎn)元素
project 元素是 Ant 構(gòu)件文件的根元素,, Ant 構(gòu)件文件至少應(yīng)該包含一個(gè) project 元素,否則會發(fā)生錯誤,。在每個(gè) project 元素下,,可包含多個(gè) target 元素。接下來向讀者展示一下 project 元素的各屬性,。 ● name 屬性:用于指定 project 元素的名稱,。
● default 屬性:用于指定 project 默認(rèn)執(zhí)行時(shí)所執(zhí)行的 target 的名稱。
● basedir 屬性:用于指定基路徑的位置,。該屬性沒有指定時(shí),,使用 Ant 的構(gòu)件文件的附目錄作為基準(zhǔn)目錄。
<?xml version="1.0" ?> <project name="ant-project" default="print-dir" basedir="."> <target name="print-dir"> <echo message="The base dir is: ${basedir}" /> </target> </project>
從上例可以看出,,在這里定義了default 屬性的值為print-dir,,即當(dāng)運(yùn)行ant 命令時(shí),如果沒有指明執(zhí)行的target,,則將執(zhí)行默認(rèn)的target(print-dir),。此外,還定義了basedir 屬性的值為 “.” ,,.表示當(dāng)前目錄,,進(jìn)入當(dāng)前目錄后運(yùn)行ant 命令,得一下結(jié)果:
2,、target節(jié)點(diǎn)元素
target為ant的基本執(zhí)行單元或是任務(wù),,它可以包含一個(gè)或多個(gè)具體的單元/任務(wù)。多個(gè)target 可以存在相互依賴關(guān)系,。它有如下屬性: ● name 屬性:指定 target 元素的名稱,,這個(gè)屬性在一個(gè) project 元素中是唯一的。我們可以通過指定 target 元素的名稱來指定某個(gè) target ,。
● depends 屬性:用于描述 target 之間的依賴關(guān)系,,若與多個(gè) target 存在依賴關(guān)系時(shí),需要以“,”間隔,。 Ant 會依照 depends 屬性中 target 出現(xiàn)的順序依次執(zhí)行每個(gè) target ,,被依賴的target 會先執(zhí)行。
● if 屬性:用于驗(yàn)證指定的屬性是存在,,若不存在,,所在 target 將不會被執(zhí)行。
● unless 屬性:該屬性的功能與 if 屬性的功能正好相反,,它也用于驗(yàn)證指定的屬性是否存在,,若不存在,所在 target 將會被執(zhí)行,。
● description 屬性:該屬性是關(guān)于 target 功能的簡短描述和說明,。
示例:
<?xml version="1.0" ?> <project name="ant-target" default="print"> <target name="version" if="ant.java.version"> <echo message="Java Version: ${ant.java.version}" /> </target> <target name="print" depends="version" unless="docs"> <description> a depend example! </description> <echo message="The base dir is: ${basedir}" /> </target> </project>
從以下結(jié)果后可以看到,我們運(yùn)行的是名為 print的target ,,由于它依賴于version這個(gè)target任務(wù),,所以 version將首先被執(zhí)行,同時(shí)因?yàn)橄到y(tǒng)配置了JDK,,所以 ant.java.version 屬性存在,,執(zhí)行了version,輸出信息:"[echo] Java Version: 1.6 ",,version執(zhí)行完畢后,,接著執(zhí)行 print,因?yàn)閐ocs不存在,,而unless屬性是在不存在時(shí)進(jìn)入所在target 的,,由此可知 print得以執(zhí)行,輸出信息:"[echo] The base dir is:D:\Workspace\AntExample\build",。
3,、property屬性節(jié)點(diǎn)元素
property元素可看作參量或者參數(shù)的定義,project 的屬性可以通過 property 元素來設(shè)定,,也可在 Ant 之外設(shè)定,。若要在外部引入某文件,例如 build.properties 文件,,可以通過如下內(nèi)容將其引: <property file="build.properties"/>
property 元素可用作 task 的屬性值,。在 task 中是通過將屬性名放在${屬性名}之間,并放在 task 屬性值的位置來實(shí)現(xiàn)的,。
Ant 提供了一些內(nèi)置的屬性,,它能得到的系統(tǒng)屬性的列表與 Java 文檔中 System.getProperties() 方法得到的屬性一致,這些系統(tǒng)屬性可參考 sun 網(wǎng)站的說明,。同時(shí),, Ant 還提供了一些它自己的內(nèi)置屬性,,如下:
basedir: project 基目錄的絕對路徑; ant.file: buildfile的絕對路徑,,上例中ant.file值為D:\Workspace\AntExample\build,;
ant.version: Ant 的版本信息,本文為1.8.1 ,;
ant.project.name: 當(dāng)前指定的project的名字,,即前文說到的project的name屬性值;
ant.java.version: Ant 檢測到的JDK版本,,本文為 1.6 ,。
舉例說明如下:
<project name="ant-project" default="example"> <property name="name" value="jojo" /> <property name="age" value="25" /> <target name="example"> <echo message="name: ${name}, age: ${age}" /> </target> </project>
上例中用戶設(shè)置了名為name 和age的兩個(gè)屬性,這兩個(gè)屬性設(shè)置后,,在下文中可以通過 ${name} 和 ${age} 分別取得這兩個(gè)屬性值,。
4、copy命令
copy主要用來對文件和目錄的復(fù)制功能,。舉例如下: ● 復(fù)制單個(gè)文件:
<copy file="old.txt" tofile="new.txt"/>
● 對文件目錄進(jìn)行復(fù)制: <copy todir="../dest_dir">
<fileset dir="src_dir"/>
</copy>
● 將文件復(fù)制到另外的目錄: <copy file="src.txt" todir="c:/base"/>
5,、delete命令
對文件或目錄進(jìn)行刪除,舉例如下:
● 刪除某個(gè)文件: <delete file="/res/image/cat.jpg"/>
● 刪除某個(gè)目錄: <delete dir="/res/image"/>
● 刪除所有的jar文件或空目錄: <delete includeEmptyDirs="true">
<fileset dir="." includes="**/*.jar"/>
</delete>
6,、 mkdir 命令
創(chuàng)建目錄,。 <mkdir dir="/home/philander/build/classes"/>
7、 move 命令
移動文件或目錄,,舉例如下: ● 移動單個(gè)文件:
<move file="sourcefile" tofile=”destfile”/>
● 移動單個(gè)文件到另一個(gè)目錄: <move file="sourcefile" todir=”movedir”/>
● 移動某個(gè)目錄到另一個(gè)目錄: <move todir="newdir">
<fileset dir="olddir"/>
</move>
8,、echo 命令
該任務(wù)的作用是根據(jù)日志或監(jiān)控器的級別輸出信息。它包括 message ,、 file ,、 append 和 level 四個(gè)屬性,舉例如下 <echo message="ant message" file="/logs/ant.log" append="true">
9,、jar 標(biāo)簽節(jié)點(diǎn)元素
該標(biāo)簽用來生成一個(gè)JAR文件,,其屬性如下。 ● destfile表示JAR文件名,。
● basedir表示被歸檔的文件名,。
● includes表示別歸檔的文件模式。
● exchudes表示被排除的文件模式,。
● compress表示是否壓縮,。
示例:
<jar destfile="${webRoot}/${ash_jar}" level="9" compress="true" encoding="utf-8" basedir="${dest}"> <manifest> <attribute name="Implementation-Version" value="Version: 2.2"/> </manifest> </jar>
上面的mainfest是jar包中的MEAT-INF中的MANIFEST.MF中的文件內(nèi)容
同樣打包操作的的還有war、tgz,,已經(jīng)解壓操作uzip
<!-- 創(chuàng)建zip --> <zip basedir="${basedir}\classes" zipfile="temp\output.zip"/> <!-- 創(chuàng)建tgz --> <gzip src="classes\**\*.class" zipfile="output.class.gz"/> <!-- 解壓zip --> <unzip src="output.class.gz" dest="extractDir"/> <!-- 建立war包 --> <war destfile="${webRoot}/ash.war" basedir="${basedir}/web" webxml="${basedir}/web/WEB-INF/web.xml"> <exclude name="WEB-INF/classes/**"/> <exclude name="WEB-INF/lib/**"/> <exclude name="WEB-INF/work/_jsp/**"/> <lib dir="${lib.dir}" includes="**/*.jar, **/*.so, **/*.dll"> <exclude name="${webRoot}\${helloworld_jar}"/> </lib> <lib file="${webRoot}/${helloworld_jar}"/> <classes dir="${dest}" includes="**/*.xml, **/*.properites, **/*.xsd"> </classes> </war>
10,、javac 標(biāo)簽節(jié)點(diǎn)元素
該標(biāo)簽用于編譯一個(gè)或一組java文件,其屬性如下,。 ● srcdir表示源程序的目錄,。
● destdir表示class文件的輸出目錄,。
● include表示被編譯的文件的模式。
● excludes表示被排除的文件的模式,。
● classpath表示所使用的類路徑,。
● debug表示包含的調(diào)試信息,。
● optimize表示是否使用優(yōu)化,。
● verbose 表示提供詳細(xì)的輸出信息。
● fileonerror表示當(dāng)碰到錯誤就自動停止,。
示例
<javac srcdir="${src}" destdir="${dest}"/> <!-- 設(shè)置jvm內(nèi)存 <javac srcdir="src" fork="true"/> <javac srcdir="src" fork="true" executable="d:\sdk141\bin\javac" memoryMaximumSize="128m"/> -->
11,、java 標(biāo)簽節(jié)點(diǎn)元素
該標(biāo)簽用來執(zhí)行編譯生成的.class文件,其屬性如下,。 ● classname 表示將執(zhí)行的類名,。
● jar表示包含該類的JAR文件名。
● classpath所表示用到的類路徑,。
● fork表示在一個(gè)新的虛擬機(jī)中運(yùn)行該類,。
● failonerror表示當(dāng)出現(xiàn)錯誤時(shí)自動停止。
● output 表示輸出文件,。
● append表示追加或者覆蓋默認(rèn)文件,。
示例
<java classname="com.hoo.test.HelloWorld" classpath="${hello_jar}"/>
12、arg 數(shù)據(jù)參數(shù)元素
由Ant構(gòu)建文件調(diào)用的程序,,可以通過<arg>元素向其傳遞命令行參數(shù),如apply,exec和java任務(wù)均可接受嵌套<arg>元素,,可以為各自的過程調(diào)用指定參數(shù),。以下是<arg>的所有屬性。 ● values 是一個(gè)命令參數(shù),。如果參數(shù)中有空格,,但又想將它作為單獨(dú)一個(gè)值,則使用此屬性,。
● file 表示一個(gè)參數(shù)的文件名,。在構(gòu)建文件中,此文件名相對于當(dāng)前的工作目錄,。
● line 表示用空格分隔的多個(gè)參數(shù)列表,。
● 表示路徑,一個(gè)作為單個(gè)命令行變量的path-like的字符串,;或作為分隔符,,Ant會將其轉(zhuǎn)變?yōu)樘囟ㄆ脚_的分隔符。
● pathref 引用的path(使用path元素節(jié)點(diǎn)定義path)的id
● prefix 前綴
● suffix 后綴
例子 <arg value="-l -a"/>
是一個(gè)含有空格的單個(gè)的命令行變量,。
<arg line="-l -a"/>
是兩個(gè)空格分隔的命令行變量,。
<arg path="/dir;/dir2:\dir3"/>
是一個(gè)命令行變量,,其值在DOS系統(tǒng)上為\dir;\dir2;\dir3;在Unix系統(tǒng)上為/dir:/dir2:/dir3 ,。
13,、ervironment 類型
由Ant構(gòu)建文件調(diào)用的外部命令或程序,<env>元素制定了哪些環(huán)境變量要傳遞給正在執(zhí)行的系統(tǒng)命令,,<env>元素可以接受以下屬性,。 ● file表示環(huán)境變量值的文件名。此文件名要被轉(zhuǎn)換位一個(gè)絕對路徑,。
● path表示環(huán)境變量的路徑,。Ant會將它轉(zhuǎn)換為一個(gè)本地約定。
● value 表示環(huán)境變量的一個(gè)直接變量,。
● key 表示環(huán)境變量名,。
注意 file path 或 value只能取一個(gè)。
14,、filelist 文件集合列表
filelist 是一個(gè)支持命名的文件列表的數(shù)據(jù)類型,,包含在一個(gè)filelist類型中的文件不一定是存在的文件。以下是其所有的屬性,。 ● dir是用于計(jì)算絕對文件名的目錄,。
● files 是用逗號分隔的文件名列表。
● refid 是對某處定義的一個(gè)<filelist>的引用,。
注意 dir 和 files 都是必要的,,除非指定了refid(這種情況下,dir和files都不允許使用),。
示例
<filelist id="docfiles" dir="${doc.src}" files="foo.xml,bar.xml"/> 文件集合 ${doc.src}/foo.xml和${doc.src}/bar.xml. 這些文件也許還是不存在的文件. <filelist id="docfiles" dir="${doc.src}" files="foo.xml bar.xml"/> <filelist refid="docfiles"/> <filelist id="docfiles" dir="${doc.src}"> <file name="foo.xml"/> <file name="bar.xml"/> </filelist>
15,、fileset 文件類型
fileset 數(shù)據(jù)類型定義了一組文件,并通常表示為<fileset>元素,。不過,,許多ant任務(wù)構(gòu)建成了隱式的fileset,這說明他們支持所有的fileset屬性和嵌套元素。以下為fileset 的屬性列表,。 ● dir表示fileset 的基目錄,。
● casesensitive的值如果為false,那么匹配文件名時(shí),,fileset不是區(qū)分大小寫的,,其默認(rèn)值為true.
● defaultexcludes 用來確定是否使用默認(rèn)的排除模式,默認(rèn)為true,。
● excludes 是用逗號分隔的需要派出的文件模式列表,。
● excludesfile 表示每行包含一個(gè)排除模式的文件的文件名。
● includes 是用逗號分隔的,需要包含的文件模式列表,。
● includesfile 表示每行包括一個(gè)包含模式的文件名,。
示例
<fileset id="lib.runtime" dir="${lib.path}/runtime"> <include name="**/*.jar"/> <include name="**/*.so"/> <include name="**/*.dll"/> </fileset> <fileset id="lib.container" dir="${lib.path}/container"> <include name="**/*.jar"/> </fileset> <fileset id="lib.extras" dir="${lib.path}"> <include name="test/**/*.jar"/> </fileset>
16、patternset 類型
fileset 是對文件的分組,,而patternset是對模式的分組,,他們是緊密相關(guān)的概念。
<patternset>支持4個(gè)屬性:includes,、excludex,、includexfile、excludesfile,,這些與fileset相同,。
patternset 還允許以下嵌套元素:include,exclude,includefile 和 excludesfile.
示例
<!-- 黑白名單 --> <patternset id="non.test.sources"> <include name="**/*.java"/> <!-- 文件名包含Test的排除 --> <exclude name="**/*Test*"/> </patternset> <patternset id="sources"> <include name="std/**/*.java"/> <!-- 判斷條件 存在professional就引入 --> <include name="prof/**/*.java" if="professional"/> <exclude name="**/*Test*"/> </patternset> <!-- 一組文件 --> <patternset includesfile="some-file"/> <patternset> <includesfile name="some-file"/> <patternset/> <patternset> <includesfile name="some-file"/> <includesfile name="${some-other-file}" if="some-other-file"/> <patternset/>
17、filterset 類型
filterset定義了一組過濾器,,這些過濾器將在文件移動或復(fù)制時(shí)完成文件的文本替換。 主要屬性如下:
● begintoken 表示嵌套過濾器所搜索的記號,,這是標(biāo)識其開始的字符串,。
● endtoken 表示嵌套過濾器所搜索的記號這是標(biāo)識其結(jié)束的字符串。
● id 是過濾器的唯一標(biāo)志符,。
● refid 是對構(gòu)建文件中某處定義一個(gè)過濾器的引用,。
示例
<!-- 將目標(biāo)文件build.dir目錄中的version.txt文件內(nèi)容中的@DATE@替換成TODAY當(dāng)前日期的值,并把替換后的文件存放在dist.dir目錄中 --> <copy file="${build.dir}/version.txt" toFile="${dist.dir}/version.txt"> <filterset> <filter token="DATE" value="${TODAY}"/> </filterset> </copy> <!-- 自定義變量的格式 --> <copy file="${build.dir}/version.txt" toFile="${dist.dir}/version.txt"> <!-- 從version.txt中的%位置開始搜索,,到*位置結(jié)束,進(jìn)行替換內(nèi)容中的@DATE@替換成TODAY當(dāng)前日期的值--> <filterset begintoken="%" endtoken="*"> <filter token="DATE" value="${TODAY}"/> </filterset> </copy> <!-- 使用外部的過濾定義文件 --> <copy toDir="${dist.dir}/docs"> <fileset dir="${build.dir}/docs"> <include name="**/*.html"> </fileset> <filterset begintoken="%" endtoken="*"> <!-- 過來文件從外部引入,,過來的屬性和值配置在dist.properties文件中 --> <filtersfile file="${user.dir}/dist.properties"/> </filterset> </copy> <!-- 使用引用方式,,重復(fù)利用過濾集 --> <filterset id="myFilterSet" begintoken="%" endtoken="*"> <filter token="DATE" value="${TODAY}"/> </filterset> <copy file="${build.dir}/version.txt" toFile="${dist.dir}/version.txt"> <filterset refid="myFilterSet"/> </copy>
18、path類型
path元素用來表示一個(gè)類路徑,,不過它還可以用于表示其他的路徑,。在用作幾個(gè)屬性時(shí),路經(jīng)中的各項(xiàng)用分號或冒號隔開,。在構(gòu)建的時(shí)候,,此分隔符將代替當(dāng)前平臺中所有的路徑分隔符,其擁有的屬性如下。 ● location 表示一個(gè)文件或目錄,。Ant在內(nèi)部將此擴(kuò)展為一個(gè)絕對路徑,。
● refid 是對當(dāng)前構(gòu)建文件中某處定義的一個(gè)path的引用。
● path表示一個(gè)文件或路徑名列表,。
示例
<path id="buildpath"> <fileset refid="lib.runtime"/> <fileset refid="lib.container"/> <fileset refid="lib.extras"/> </path> <path id="src.paths"> <fileset id="srcs" dir="."> <include name="src/**/*.java"/> </fileset> </path>
八、ant編譯打包,、運(yùn)行工程
<?xml version="1.0" encoding="UTF-8"?> <!-- name是當(dāng)前工程的名稱,,default是默認(rèn)執(zhí)行的任務(wù),basedir是工作目錄(.代表當(dāng)前根目錄) --> <project name="HelloWorld" default="run" basedir="."> <!-- property類似于程序中定義簡單的變量 --> <property name="src" value="src"/> <property name="dest" value="classes"/> <property name="hello_jar" value="helloWorld.jar"/> <!-- target是一個(gè)事件,、事情,、任務(wù), name是當(dāng)前事情的名稱,,depends是依賴的上一件或是多件事情 如果所依賴的事情沒有執(zhí)行,,ant會先運(yùn)行依賴事情,然后再運(yùn)行當(dāng)前事情 --> <!-- 初始化 --> <target name="init"> <!-- 建立classes目錄 --> <mkdir dir="${dest}"/> <mkdir dir="temp"/> <mkdir dir="temp2"/> </target> <!-- 編譯 --> <target name="compile" depends="init"> <javac srcdir="${src}" destdir="${dest}"/> <!-- 設(shè)置jvm內(nèi)存 <javac srcdir="src" fork="true"/> <javac srcdir="src" fork="true" executable="d:\sdk141\bin\javac" memoryMaximumSize="128m"/> --> </target> <!-- 建立jar包 --> <target name="build" depends="compile"> <!-- <jar jarfile="${hello_jar}" basedir="${dest}"/> 創(chuàng)建一個(gè)名稱是package.jar文件 <jar destfile="package.jar" basedir="classes"/> --> <jar destfile="${hello_jar}" basedir="classes"> <!-- 向jar包中的main文件中添加內(nèi)容 --> <manifest> <attribute name="Built-By" value="${user.name}"/> <attribute name="Main-class" value="package.Main"/> </manifest> </jar> <!-- 復(fù)制jar文件 todir="復(fù)制到目錄"--> <copy file="${hello_jar}" tofile="${dest}\temp.jar"/> <copy todir="temp"> <!-- 不按照默認(rèn)方式 defaultexcludes="" --> <fileset dir="src"> <include name="**/*.java"/> </fileset> </copy> <copy todir="temp2"> <fileset dir="src"> <and> <contains text="main"/> <size value="1" when="more"/> </and> </fileset> </copy> <!-- 移動jar文件 --> <move file="${dest}\temp.jar" tofile="temp\move-temp.jar"/> <!-- 創(chuàng)建zip --> <zip basedir="${basedir}\classes" zipfile="temp\output.zip"/> <!-- 創(chuàng)建tgz --> <gzip src="classes\**\*.class" zipfile="output.class.gz"/> <!-- 解壓zip --> <unzip src="output.class.gz" dest="extractDir"/> <!--替換input.txt內(nèi)容中的old為new <replace file="input.txt" token="old" value="new"/> --> </target> <!-- 運(yùn)行 --> <target name="run" depends="build"> <java classname="com.hoo.test.HelloWorld" classpath="${hello_jar}"/> </target> <!-- 清除 --> <target name="clean"> <!-- 刪除生成的文件 --> <delete dir="${dest}"/> <delete file="${hello_jar}"/> </target> <tstamp> <format property="OFFSET_TIME" pattern="HH:mm:ss" offset="10" unit="minute"/> </tstamp> <!-- 重新運(yùn)行 --> <target name="rerun" depends="clean,run"> <echo message="###${TSTAMP}#${TODAY}#${DSTAMP}###"/> <aunt target="clean"/> <aunt target="run"/> </target> </project>
要說的的東西基本上就那么多,,ant還有很多內(nèi)容沒有提到,,有興趣的可以自己去研究研究。ant不難,,你用它就像是在docs控制臺輸入命令行一樣,,只不過ant是將命令行轉(zhuǎn)換為xml的腳本信息,可以進(jìn)行重復(fù)的運(yùn)行,。在一定情況下,,提高了效率和重復(fù)的工作。
|