1、Ant的用途
?? 用于生成Java項(xiàng)目。
?? 跨平臺(tái)方式執(zhí)行文件操作。
?? 使用第三方Ant任務(wù),編寫(xiě)自定義Ant任務(wù)。
2、Ant是什么
?? Apache Ant是一個(gè)基于Java的生成工具。是Another Neat Tool的縮寫(xiě)。生成工具在軟件開(kāi)發(fā)中用來(lái)將源代碼和其他輸入文件轉(zhuǎn)換為可執(zhí)行文件的形式。Ant與Make類似,但是具有跨平臺(tái)的特色。
3、Ant生成文件剖析
?? 每個(gè)生成文件由單個(gè)的Project元素組成,Project元素又包含多個(gè)target元素。一個(gè)target是生成過(guò)程中已定義的一個(gè)步驟。他執(zhí)行任意數(shù)量的操作。操作本身是由其他專用任務(wù)標(biāo)簽執(zhí)行的。頂級(jí)project元素包含一個(gè)default屬性,在Ant被調(diào)用而沒(méi)有指定目標(biāo)時(shí),這個(gè)屬性將指定要執(zhí)行的目標(biāo)。然后需要使用target元素來(lái)定義該目標(biāo)本身。
? eg:
? <?xml version="1.0"?>
? <project default="init">
??? <target name="init">
??? </target>
? </project>
3、添加描述
?? Ant自己添加了description元素和description屬性。
4、Ant中的屬性
?? 屬性一旦設(shè)置,就不可再改變。
?? 申明屬性的方法:
?? <property name="metal" value="beryllium"/>
?? 使用屬性的方法:
?? ${metal}
?? eg:
?? <property name="metal_database" value="${metal}.db"/>
?? Ant自定義的屬性:
?? ${user.home}、${ant.version}、${basedir}等等。
?? Ant 的 location 屬性專門(mén)設(shè)計(jì)用于以平臺(tái)無(wú)關(guān)的方式包含文件系統(tǒng)路徑。您會(huì)像下面這樣使?? 用 location 來(lái)代替value:
?? <property name="database-file" location="archive/databases/${metal}.db"/>
5、定義依賴關(guān)系
?? target元素的depends屬性確定依賴關(guān)系。eg:?
?? <target name="compile" depends="init,preprocess"/>
?? 與多個(gè)target有依賴關(guān)系時(shí),中間用‘,’分開(kāi)
6、Ant的運(yùn)行
?? Ant可以在集成開(kāi)發(fā)環(huán)境下(IDE)運(yùn)行,也可以在命令行運(yùn)行。
?? 在命令運(yùn)行的選項(xiàng)有:
?? 沒(méi)有參數(shù)時(shí),默認(rèn)尋找build.xml文件
?? -buildfile(-f) filename 以filename文件作為Ant文件運(yùn)行
?? -D propertyName=value 覆蓋生成文件中的初始屬性設(shè)置。
7、常用的任務(wù)標(biāo)簽
?? <javac srcdir="" classpath="" debug="" fork="" executable="filepath"/> debug、fork?? 可以取true/false。executable指定javac的目錄。eg:d:\sdk141\bin\javac。executable一???? 般于fork配合使用
?? <jar destfile="package.jar" basedir="classes"/>
?? 這將創(chuàng)建一個(gè)名為 package.jar 的 JAR 文件,并把 classes 目錄中的所有文件添加到其中??? (JAR 文件能夠包含任意類型的文件,而不只是類文件)。此處沒(méi)有指定清單文件,因此 Ant???? 將提供一個(gè)基本的清單文件。
?? manifest 屬性允許指定一個(gè)用作該 JAR 文件的清單的文件。清單文件的內(nèi)容還可以使用?????? manifest 任務(wù)在生成文件中指定。這個(gè)任務(wù)能夠像文件系統(tǒng)寫(xiě)入一個(gè)清單文件,或者能夠?qū)???? 際嵌套在 jar 之內(nèi),以便一次性地創(chuàng)建清單文件和 JAR 文件。 例如:
?? <jar destfile="package.jar" basedir="classes">
????? <manifest>
??????? <attribute name="Built-By" value="${user.name}"/>
??????? <attribute name="Main-class" value="package.Main"/>
????? </manifest>
?? </jar>
?? <mkdir dir="${buildDir}"/>
?? <tstamp/>
?? <delete dir="${buildDir}"/>
?? <copy file="src/Test.java" tofile="src/TestCopy.java"/>
?? <move file="src/Test.java" tofile="src/TestCopy.java"/>
?? <copy file="src/Test.java" todir="archive"/>
?? <move file="src/Test.java" todir="archive"/>
?? <zip destfile="output.zip" basedir="output"/>
?? <gzip src="output.tar" zipfile="output.tar.gz"/>
?? <unzip src="output.tar.gz" dest="extractDir"/>
?? 還可以包括 overwrite 屬性來(lái)控制覆蓋行為。默認(rèn)設(shè)置是覆蓋與正在被提取的歸檔文件中的???? 條目相匹配的所有現(xiàn)有文件。相關(guān)的任務(wù)名稱是 untar、unjar、gunzip 和 bunzip2。
?? <replace file="input.txt" token="old" value="new"/>
?? token 屬性指定要查找的字符串,value 屬性指定一個(gè)新的字符串,查找到的標(biāo)記字符串的所?? 有實(shí)例都被替換為這個(gè)新的字符串
8、模式匹配
? <copy todir="archive">
??? <fileset dir="src">
????? <include name="*.java"/>
??? </fileset>
? </copy>
? fileset 默認(rèn)情況下包含指定 src 目錄下的所有文件,因此為了僅選擇 Java 文件,我們對(duì)模? 式使用一個(gè) include 元素。類似地,我們可以對(duì)另一個(gè)模式添加一個(gè) exclude 元素,從而潛? 在地排除include指定的匹配項(xiàng)。甚至可以指定多個(gè)include 和 exclude 元素;這樣將得到一? 組文件和目錄,它們包含 include 模式的所有匹配項(xiàng)的并集,但排除了 exclude 模式的所有? 匹配項(xiàng)。
9、Ant 可用的核心選擇器的列表:
size:這個(gè)選擇器用于根據(jù)文件的字節(jié)大小選擇文件(除非使用 units 屬性來(lái)指定了不同的單位)。when 屬性用于設(shè)置比較的性質(zhì)(less、more 或者 equal),value 屬性定義每個(gè)文件將與之作比較的目標(biāo)大小。
contains:只有包含給定文本字符串(由text 屬性指定)的文件才匹配這個(gè)選擇器。默認(rèn)情況下,查找操作是大小寫(xiě)敏感的;添加casesensitive="no" 可以改變默認(rèn)設(shè)置。
filename:name 屬性指定文件名要與之匹配的模式。它本質(zhì)上與 include 元素相同,以及與指定了negate="yes" 時(shí)的 exclude 元素相同。
present:從當(dāng)前目錄結(jié)構(gòu)中選擇如下文件:它們與指定的 targetdir 目錄中的文件具有相同的名稱和相對(duì)目錄結(jié)構(gòu)。
depend:這個(gè)選擇器與 present 選擇器具有相同的效果,只不過(guò)匹配的文件被限制到相對(duì)于 targetdir 位置中的對(duì)應(yīng)文件來(lái)說(shuō),最近已修改過(guò)的那些文件。
date:這個(gè)選擇器基于其最后修改日期選擇文件。when 屬性指定作比較的性質(zhì)是 before、after 還是 equal,datetime 屬性指定與之作比較的日期和時(shí)間,這個(gè)日期和時(shí)間具有給定的固定格式 MM/DD/YYYY HH:MM AM_or_PM。注意 Windows 平臺(tái)上有一個(gè)內(nèi)置的 2 秒偏移,以允許底層文件系統(tǒng)的不精確性 —— 這可能導(dǎo)致匹配的文件數(shù)量超過(guò)預(yù)期。允許的回旋時(shí)間量可以使用 granularity 屬性來(lái)更改(以毫秒為單位來(lái)指定)。
depth:這個(gè)選擇器檢查每個(gè)文件的目錄結(jié)構(gòu)層次數(shù)目。min 和/或 max 屬性用于選擇具有想要的目錄層次數(shù)目的的文件。
eg:
<fileset dir="dir">
??? <and>
??????? <contains text="hello"/>
??????? <size value="512" when="more"/>
??? </and>
</fileset>
10、將生成文件鏈接起來(lái)
可以使用 antfile 屬性,僅指定那些要使用的生成文件,Ant 將生成該生成文件中的默認(rèn)目標(biāo)。例如:<ant antfile="sub-build.xml"/>
在父生成文件中定義的任何屬性默認(rèn)將傳遞給子生成文件,雖然這可以通過(guò)指定 inheritAll="false"來(lái)避免。通過(guò)使用 property 元素來(lái)傳入顯式的屬性也是可以做到的 —— 即使將 inheritAll 設(shè)置為 false,這些屬性也仍然適用于子生成文件。這個(gè)功能很適合用于給子生成文件傳入?yún)?shù)。
讓我們來(lái)考慮一個(gè)例子。下面是我們想要調(diào)用的一個(gè)生成文件:
<?xml version="1.0"?>
<project default="showMessage">
??? <target name="showMessage">
??????? <echo message="Message=${message}"/>
??? </target>
</project>
(我們?cè)谇懊孢€沒(méi)有遇到過(guò) echo 任務(wù) —— 它簡(jiǎn)單地輸出給定的消息。)
下面是調(diào)用第一個(gè)生成文件的第二生成文件,它還給第一個(gè)生成文件傳入 message 屬性:
<?xml version="1.0"?>
<project default="callSub">
??? <target name="callSub">
??????? <ant antfile="sub.xml" target="showMessage" inheritAll="false">
??????????? <property name="message" value="Hello from parent build"/>
??????? </ant>
??? </target>
</project>
11、使用 CVS 知識(shí)庫(kù)
下面是從 CVS 知識(shí)庫(kù)提取模塊的一個(gè)例子生成文件:
<?xml version="1.0"?>
<project name="CVS Extract" default="extract" basedir=".">
<property name="cvsRoot" value=":pserver:anonymous@dev.eclipse.org:/home/eclipse"/>
??? <target name="extract">
??????? <cvs cvsRoot="${cvsRoot}"
???????????? package="org.eclipse.swt.examples"
??????????????? dest="${basedir}"/>
??? </target>
</project>
cvs 任務(wù)的主要屬性是 cvsRoot,它是對(duì) CVS 知識(shí)庫(kù)的完整引用,包括連接方法和用戶詳細(xì)信息。這個(gè)參數(shù)的格式如下:
[:method:][[user][:password]@]hostname[:[port]]/path/to/repository
在上面的例子中,我們作為匿名用戶連接到 Eclipse 項(xiàng)目的中央知識(shí)庫(kù)。然后其他屬性指定了我們希望提取的模塊以及放置提取文件的目的地。提取是 CVS 任務(wù)的默認(rèn)操作;其他操作可通過(guò)使用 command 屬性來(lái)指定。
注意,為了利用 Ant 中的 cvs 任務(wù),您需要在機(jī)器上安裝 cvs 命令,并使其從命令行可用。