官網:https://ant.apache.org/,task介紹:https://ant.apache.org/manual/index.htmlhtml
Ant的構建文件當開始一個新的項目時,首先應該編寫Ant構建文件。構建文件定義了構建過程,並被團隊開發中每一個人使用。Ant構建文件默認命名爲build.xml,也能夠取其餘的名字。只不過在運行的時候把這個命名看成參數傳給Ant。構建文件能夠放在任何的位置。通常作法是放在項目頂層目錄中,這樣能夠保持項目的簡潔和清晰。下面是一個典型的項目層次結構。
(1) src存放文件。
(2) class存放編譯後的文件。
(3) lib存放第三方JAR包。
(4) dist存放打包,發佈之後的代碼。
Ant構建文件是XML文件。每一個構建文件定義一個惟一的項目(Project元素)。每一個項目下能夠定義不少目標(target元素),這些目標之間能夠有依賴關係。當執行這類目標時,須要執行他們所依賴的目標。每一個目標中能夠定義多個任務,目標中還定義了所要執行的任務序列。Ant在構建目標時必須調用所定義的任務。任務定義了Ant實際執行的命令。Ant中的任務能夠爲3類。
(1) 核心任務。核心任務是Ant自帶的任務。
(2) 可選任務。可選任務實來自第三方的任務,所以須要一個附加的JAR文件。
(3) 用戶自定義的任務。用戶自定義的任務實用戶本身開發的任務。java
說白了,ANT就是經過XML執行一些任務,能夠簡化操做,好比:編譯Java,執行Java命令,打Jar包,打War包等操做。接下來會慢慢研究這些操做。git
ant -help 查看幫助信息便可web
C:\Users\XXX\Desktop\antProject>ant -help ant [options] [target [target2 [target3] ...]] Options: -help, -h print this message and exit -projecthelp, -p print project help information and exit -version print the version information and exit -diagnostics print information that might be helpful to diagnose or report problems and exit -quiet, -q be extra quiet -silent, -S print nothing but task outputs and build failures -verbose, -v be extra verbose -debug, -d print debugging information -emacs, -e produce logging information without adornments -lib <path> specifies a path to search for jars and classes -logfile <file> use given file for log -l <file> '' -logger <classname> the class which is to perform logging -listener <classname> add an instance of class as a project listener -noinput do not allow interactive input -buildfile <file> use given buildfile -file <file> '' -f <file> '' -D<property>=<value> use value for given property -keep-going, -k execute all targets that do not depend on failed target(s) -propertyfile <name> load all properties from file with -D properties taking precedence -inputhandler <class> the class which will handle input requests -find <file> (s)earch for buildfile towards the root of -s <file> the filesystem and use it -nice number A niceness value for the main thread: the default -nouserlib Run ant without using the jar files from -noclasspath Run ant without using CLASSPATH -autoproxy Java1.5+: use the OS proxy settings -main <class> override Ant's normal entry point
一個簡單的build.xmlapache
<project name="HelloWorld" default="test" basedir="">
<target name="test">
<echo message="Hello, world"/>
<echo message="This is info message." level="info" />
</target>
</project>
運行上面的build.xml:(直接ant就能夠了)api
C:\Users\liqiang\Desktop\antProject>ls build.xml C:\Users\liqiang\Desktop\antProject>ant Buildfile: C:\Users\liqiang\Desktop\antProject\build.xml test: [echo] Hello, world [echo] This is info message. BUILD SUCCESSFUL Total time: 1 second
例如:文件的名字是buildXX.xmltomcat
C:\Users\liqiang\Desktop\antProject>ls buildXX.xml C:\Users\liqiang\Desktop\antProject>ant -buildfile ./buildXX.xml Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml test: [echo] Hello, world [echo] This is info message. BUILD SUCCESSFUL Total time: 2 seconds
其實查看標籤有什麼屬性,去task官網查看該task有什麼屬性即該標籤有什麼屬性。下面只是介紹部分標籤以及其重要屬性,更全的標籤參考官網 :https://ant.apache.org/manual-1.9.x/index.htmlapp
每一個構建文件對應一個項目。<project>標籤時構建文件的根標籤。它能夠有多個內在屬性,就如代碼中所示,其各個屬性的含義分別以下。
(1) default表示默認的運行目標,這個屬性是必須的。
(2) basedir表示項目的基準目錄。
(3) name表示項目名。
(4) description表示項目的描述。
每一個構建文件都對應於一個項目,可是大型項目常常包含大量的子項目,每個子項目均可以有本身的構建文件。 less
一個項目標籤下能夠有一個或多個target標籤。一個target標籤能夠依賴其餘的target標籤。例如,有一個target用於編譯程序,另外一個target用於聲稱可執行文件。在生成可執行文件以前必須先編譯該文件,所以可執行文件的target依賴於編譯程序的target。Target的全部屬性以下。
(1) name表示標明,這個屬性是必須的。
(2) depends表示依賴的目標。
(3) if表示僅當屬性設置時才執行。
(4) unless表示當屬性沒有設置時才執行。
(5) description表示項目的描述。
Ant的depends屬性指定了target的執行順序。Ant會依照depends屬性中target出現順序依次執行每一個target。在執行以前,首先須要執行它所依賴的targeteclipse
message:須要打印的信息,能夠用${}取變量
file:將message寫入到文件中
append:是否已追加模式寫入文件
level:級別,相似於日誌級別(在開發工具中不能級別顯示的信息不一樣)
encoding:使用的編碼格式
force:是否強制寫入到一個只讀的文件中
例如:
<project name="HelloWorld" default="" basedir=""> <echo file="test.log" message="測試1" level="debug" append="true" encoding="utf-8"/> <echo file="test.log" message="測試2" level="info" append="true" encoding="utf-8"/> <echo file="test.log" message="測試3" level="warning" append="true" encoding="utf-8"/> <echo file="test.log" message="測試4" level="error" append="true" encoding="utf-8"/> </project>
結果:
C:\Users\liqiang\Desktop\antProject>ant -buildfile buildXX.xml Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml BUILD SUCCESSFUL Total time: 1 second C:\Users\liqiang\Desktop\antProject>cat ./test.log 測試1測試2測試3測試4
該標籤用於建立一個目錄,它有一個屬性dir用來指定所建立的目錄名,以下:
<project name="HelloWorld" default="test" basedir=""> <target name="test"> <mkdir dir = "tttt"/> </target> </project>
或者:
<project name="HelloWorld" default="" basedir=""> <mkdir dir = "tttt"/> </project>
執行上面腳本:
C:\Users\liqiang\Desktop\antProject>ls buildXX.xml C:\Users\liqiang\Desktop\antProject>ant -buildfile ./buildXX.xml Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml test: [mkdir] Created dir: C:\Users\liqiang\Desktop\antProject\tttt BUILD SUCCESSFUL Total time: 1 second C:\Users\liqiang\Desktop\antProject>ls buildXX.xml tttt
該標籤用於刪除一個文件或一組文件,屬性以下:
(1).file表示要刪除的文件。
(2).dir表示要刪除的目錄。
(3).includeEmptyDirs 表示指定是否要刪除空目錄,默認值是刪除。
(4).failonerror 表示指定當碰到錯誤是否中止,默認值是自動中止。
(5).verbose表示指定是否列出所刪除的文件,默認值爲不列出。
例如刪除一個文件夾:
<project name="HelloWorld" default="" basedir=""> <delete dir="ttt"/> </project>
該標籤用於文件或文件集的拷貝,其屬性以下。
(1).file 表示源文件。
(2).tofile 表示目標文件。
(3).todir 表示目標目錄。
(4).overwrite 表示指定是否覆蓋目標文件,默認值是不覆蓋。
(5).includeEmptyDirs 表示制定是否拷貝空目錄,默認值爲拷貝。
(6).failonerror 表示指定如目標沒有發現是否自動中止,默認值是中止。
(7).verbose 表示制定是否顯示詳細信息,默認值不顯示。
例如:複製文件
<project name="HelloWorld" default="" basedir=""> <copy file="buildXX.xml" tofile="./build.xml"/> </project>
批量複製的腳本:
<copy todir="${basedir}/dist/examBuildClass"> <fileset dir="${basedir}/src"> <include name="**/**.xml" /> </fileset> </copy>
<include name="**/**.xml" />是包含本目錄以及子目錄的xml文件
<include name="**.xml" />是本目錄的xml文件,不包含子目錄
兩個標籤都有最基本的屬性:src和dest表示源文件和目的文件
<project name="HelloWorld" default="" basedir=""> <copyfile src="buildXX.xml" dest="./build.xml"/> </project>
該標籤用於編譯一個或一組java文件,其屬性以下:
(1).srcdir表示源程序的目錄。
(2).destdir表示class文件的輸出目錄。
(3).include表示被編譯的文件的模式。
(4).excludes表示被排除的文件的模式。
(5).classpath表示所使用的類路徑。
(6).debug表示包含的調試信息。
(7).optimize表示是否使用優化。
(8).verbose 表示提供詳細的輸出信息。
(9).fileonerror表示當碰到錯誤就自動中止。
例如:編譯本目錄下的一個java文件
public class Test { public Test() { } public static void main(String[] args) { System.out.print("1"); } }
編譯腳本
<project name="HelloWorld" default="" basedir=""> <javac srcdir="./" destdir="./" fork="true" source="1.2" target="1.2" /> </project>
測試:
C:\Users\liqiang\Desktop\antProject>ant -buildfile ./buildXX.xml Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml [javac] C:\Users\liqiang\Desktop\antProject\buildXX.xml:7: warning: 'include uild.sysclasspath=last; set to false for repeatable builds [javac] Compiling 1 source file to C:\Users\liqiang\Desktop\antProject [javac] 警告: [options] 未與 -source 1.3 一塊兒設置引導類路徑 [javac] 警告: [options] 源值1.3已過期, 將在將來全部發行版中刪除 [javac] 警告: [options] 目標值1.2已過期, 將在將來全部發行版中刪除 [javac] 警告: [options] 要隱藏有關已過期選項的警告, 請使用 -Xlint:-options。 [javac] 4 個警告 BUILD SUCCESSFUL Total time: 6 seconds C:\Users\liqiang\Desktop\antProject>javap -c -v Test.class | grep major major version: 46
該標籤用來執行編譯生成的.class文件,其屬性以下。
(1).classname 表示將執行的類名。
(2).jar表示包含該類的JAR文件名。
(3).classpath所表示用到的類路徑。
(4).fork表示在一個新的虛擬機中運行該類。
(5).failonerror表示當出現錯誤時自動中止。
(6).output 表示輸出文件。
(7).append表示追加或者覆蓋默認文件。
例如運行上面的class文件:(必須指定classpath包含當前路徑)
<project name="HelloWorld" default="" basedir=""> <java classname="Test" classpath="./;${classpath}"> </java> </project>
補充:此標籤也能運行Jar文件,相似於java -jar命令:
例如,運行下面9打的jar包(必須制定fork參數,maxmemory制定JVM大小)
<project name="HelloWorld" default="" basedir=""> <java jar="app.jar" fork="true" failonerror="true" maxmemory="128m"/> </project>
該標籤用來生成一個JAR文件,其屬性以下。
(1) destfile表示JAR文件名。
(2) basedir表示被歸檔的文件名。
(3) includes表示別歸檔的文件模式。
(4) exchudes表示被排除的文件模式。
例如打包上面的class文件:(下面命令會生成主菜單清單,也就是生成MANIFEST.MF,而且寫入主函數入口,能夠經過java -jar運行)
<project name="HelloWorld" default="" basedir=""> <jar destfile="./app.jar" basedir="./" includes="**/*.class" excludes="**/Test11111111111.class" > <manifest> <attribute name="Main-Class" value="Test"/> </manifest> </jar> </project>
結果:
關於此task在weblogic編譯JSP的時候就研究過,參考:http://www.javashuo.com/article/p-aygnbvzp-cv.html
zip用於壓縮,打zip包,以下:
<project name="HelloWorld" default="" basedir=""> <zip destfile="./manual.zip" basedir="./"/> </project>
結果:
unzip用於解壓縮
<project name="HelloWorld" default="" basedir=""> <zip destfile="./manual.zip" basedir="./"/> </project>
有時候咱們但願讀取一個的內容到某個屬性中,例如:
<project name="HelloWorld" default="" basedir=""> <loadfile property="test" srcFile="./buildXX.xml" encoding="GBK"/> <echo message="${test}"/> </project>
結果:
C:\Users\liqiang\Desktop\antProject>ant -buildfile ./buildXX.xml Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml [echo] <project name="HelloWorld" default="" basedir=""> [echo] <loadfile property="test" srcFile="./buildXX.xml" encoding="GBK"/> [echo] <echo message="${test}"/> [echo] </project> BUILD SUCCESSFUL Total time: 2 seconds
loadproperties標籤,會加載properties文件中的內容爲本文件的properties變量,經過${varname}能夠獲取變量的值,例如:
<project name="HelloWorld" default="" basedir=""> <loadproperties srcFile="log4j.properties"/> <echo message="${log4j.rootLogger}"/> </project>
結果:
C:\Users\liqiang\Desktop\antProject>cat log4j.properties | grep rootLo log4j.rootLogger=debug, stdout C:\Users\liqiang\Desktop\antProject>ant -buildfile buildXX.xml Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml [echo] debug, stdout BUILD SUCCESSFUL Total time: 2 seconds
例如:獲取某個http的源碼。property是讀取回來的property的變量,encoding指定解析的編碼。
<project name="HelloWorld" default="" basedir=""> <loadresource property="indexresource" encoding="utf-8"> <url url="http://qiaoliqiang.cn/"/> </loadresource> <echo message="${indexresource}"/> </project>
例如,一個txt文件中的原來的內容爲123,咱們用ant腳本將1換爲3
<project name="HelloWorld" default="" basedir=""> <replace file="./1.txt" token="1" value="3"/> </project>
結果:
C:\Users\liqiang\Desktop\antProject>cat 1.txt 123 C:\Users\liqiang\Desktop\antProject>ant -buildfile ./buildXX.xml Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml BUILD SUCCESSFUL Total time: 3 seconds C:\Users\liqiang\Desktop\antProject>cat 1.txt 323
補充:學習了讀取文件與替換文件,咱們就能夠用ant腳本寫一個文件的內容替換另外一個文件的指定內容
例如 1.txt內容是"321" 2.txt內容是"123 456" ,咱們的需求是將2.txt中的123替換爲1.txt中的內容。腳本以下:
<project name="HelloWorld" default="" basedir=""> <loadfile property="test" srcFile="./1.txt" encoding="GBK"/> <replace file="./2.txt" token="123" value="${test}"/> </project>
結果:
C:\Users\liqiang\Desktop\antProject>cat 1.txt 321 C:\Users\liqiang\Desktop\antProject>cat 2.txt 123 456 C:\Users\liqiang\Desktop\antProject>ant -buildfile ./buildXX.xml Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml BUILD SUCCESSFUL Total time: 3 seconds C:\Users\liqiang\Desktop\antProject>cat 2.txt 321 456
設置一個本地變量, 能夠經過${}屢次調用。
<project name="HelloWorld" default="" basedir=""> <property name="var1" value="dist"/> <echo message="${var1}"/> </project>
補充:其file屬性也能夠引入另外一個properties文件,此種方式相似於咱們項目中使用properties文件:
ant.properties
name=username
password=userpassword
build.xml:
<?xml version="1.0" encoding="UTF-8"?> <project name="HelloWorld" default="test" basedir=""> <property file="ant.properties"></property> <target name="test"> <echo message="${name}" /> <echo message="${password}" level="info" /> </target> </project>
結果:
Buildfile: E:\xiangmu\MavenProject\build.xml
test:
[echo] username
[echo] userpassword
BUILD SUCCESSFUL
Total time: 1 second
import用於合併多個build.xml,能夠簡單理解爲將另外一個xml中project中的內容引入當前xml的project中。兩個xml的project的name不能相同。
例如:buildXX.xml
<project name="HelloWorld" default="default" basedir=""> <import file="./buildXX1.xml"/> <target name="default" depends="t1"> <antcall target="t1"></antcall> </target> </project>
buildXX1.xml
<project name="HelloWorld1" default="" basedir=""> <property name="var1" value="dist"/> <target name="t1"> <echo message="${var1}"/> </target> </project>
結果:
C:\Users\liqiang\Desktop\antProject>ant -buildfile buildXX.xml Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml t1: [echo] dist default: t1: [echo] dist
有時咱們在指定位置但願調用其餘target,target的depends屬性會在執行本target前就執行另外一個target,antcall能夠在指定位置調用另外一個target
<project name="HelloWorld" default="t3" basedir=""> <target name="t1"> <echo message="=====1===="/> </target> <target name="t2"> <echo message="=====2===="/> </target> <target name="t3" depends="t1"> <echo message="=====3===="/> <antcall target="t2"/> </target> </project>
結果:
C:\Users\liqiang\Desktop\antProject>ant -buildfile ./buildXX.xml Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml t1: [echo] =====1==== t3: [echo] =====3==== t2: [echo] =====2==== BUILD SUCCESSFUL Total time: 1 second
目錄結構:
原來文件內容:
exam.1.txt
111
exam.2.txt
222
exam.3txt
333
exam.txt
444
(1)簡單的合併文件,將文件內容合併到文件中:(是以覆蓋的方式進行合併)
<project name="exam" default="default" basedir="."> <!-- import properties file--> <echo message="basedir = ${basedir}"/> <target name="default"> <concat destfile="${basedir}/exam.txt">Hello, World!</concat> </target> </project>
控制檯:
Buildfile: E:\xiangmu\Exam\build.xml
[echo] basedir = E:\xiangmu\Exam
default:
BUILD SUCCESSFUL
Total time: 314 milliseconds
查看exam.txt:
Hello, World!
(2)簡單的合併文件,將文件內容合併到文件中:(以追加的方式進行合併-----append屬性)
<project name="exam" default="default" basedir="."> <!-- import properties file--> <echo message="basedir = ${basedir}"/> <target name="default"> <concat destfile="${basedir}/exam.txt" append="true">Hello, World!</concat> </target> </project>
查看exam.txt:
Hello, World!Hello, World!
(3)合併多個文件,以覆蓋的方式進行合併
<project name="exam" default="default" basedir="."> <!-- import properties file--> <echo message="basedir = ${basedir}" /> <target name="default"> <concat destfile="${basedir}/exam.txt"> <filelist dir="${basedir}" files="exam.1.txt,exam.2.txt" /> <fileset dir="${basedir}" includes="exam.*.txt" excludes="exam.txt" /> </concat> </target> </project>
查看exam.txt:
111222111222333
追加只用append=true
前提是自定義的task的類要有public xxx execute()方法,例如:
public class Test { public Test() { } public void execute(){ System.out.println("11111111"); } }
編譯以後生成成class文件:
編寫自定義task並調用的腳本:
<project name="HelloWorld" default="test" basedir="">
<taskdef name="mytask" classpath="./" classname="Test"/>
<mytask/>
<echo message="======================"/>
<target name="test">
<mytask/>
</target>
</project>
結果:
C:\Users\liqiang\Desktop\antProject>ant -buildfile ./buildXX.xml Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml [mytask] 11111111 [echo] ====================== test: [mytask] 11111111 BUILD SUCCESSFUL Total time: 1 second
在構建文件中爲了標識文件或文件組,常常須要使用數據類型。數據類型包含在 org.apache.tool.ant.types 包中。其實查看這些標籤有哪些屬性能夠查看官網:http://ant.apache.org/manual-1.9.x/api/
下面簡單介紹構建文件中一些經常使用的數據類型。
由Ant構建文件調用的程序,能夠經過<arg>元素向其傳遞命令行參數,如apply,exec和java任務都可接受嵌套<arg>元素,能夠爲各自的過程調用指定參數。如下是<arg>的全部屬性。
(1)value 是一個命令參數。若是參數中有空格,但又想將它做爲單獨一個值,則使用此屬性。
(2)file表示一個參數的文件名。在構建文件中,此文件名相對於當前的工做目錄。
(3)line表示用空格分隔的多個參數列表。
(4)path表示路徑。
例如:對於以下一段程序:
public class Mytest { public static void main(String[] args) { for(String s:args){ System.out.println(s); } } }
咱們能夠經過line傳遞參數:(空格分隔的多個參數列表)
<project name="HelloWorld" default="" basedir=""> <java classname="Mytest" classpath="./;${classpath}"> <arg line="1 2 3 '4'"/> </java> </project>
結果:
C:\Users\liqiang\Desktop\antProject>ant -buildfile buildXX.xml Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml [java] 1 [java] 2 [java] 3 [java] 4 BUILD SUCCESSFUL Total time: 1 second
咱們也能夠用value傳遞單個參數,會當作一個字符串元素處理:
<project name="HelloWorld" default="" basedir=""> <java classname="Mytest" classpath="./;${classpath}"> <arg value="1 2 3 '4'"/> </java> </project>
結果:
C:\Users\liqiang\Desktop\antProject>ant -buildfile buildXX.xml Buildfile: C:\Users\liqiang\Desktop\antProject\buildXX.xml [java] 1 2 3 '4' BUILD SUCCESSFUL Total time: 2 seconds
Path元素用來表示一個類路徑,不過它還能夠用於表示其餘的路徑。在用做揖個屬性時,路經中的各項用分號或冒號隔開。在構建的時候,此分隔符將代替當前平臺中全部的路徑分隔符,其擁有的屬性以下。
(1).location 表示一個文件或目錄。Ant在內部將此擴展爲一個絕對路徑。
(2).refid 是對當前構建文件中某處定義的一個path的引用。
(3).path表示一個文件或路徑名列表。
例如:(經過下面方法定義path路徑,並在classpathref引入path的id便可)
<project name="HelloWorld" default="" basedir=""> <path id="myclass.classpath" path="./"></path> <java classname="Mytest" classpathref="myclass.classpath" fork="true"> <arg value="1 2 3 '4'"/> </java> </project>
與上面等價功能的XML以下:
<project name="HelloWorld" default="" basedir=""> <path id="myclass.classpath" location="./"></path> <java classname="Mytest" classpathref="myclass.classpath" fork="true"> <arg value="1 2 3 '4'"/> </java> </project>
<project name="HelloWorld" default="" basedir=""> <path id="myclass.classpath" location="./"></path> <path id="myclass.classpath1" refid="myclass.classpath"></path> <java classname="Mytest" classpathref="myclass.classpath1" fork="true"> <arg value="1 2 3 '4'"/> </java> </project>
(1).dir是用於計算絕對文件名的目錄。
(2).files 是用逗號分隔的文件名列表。 (若是是class文件不用寫後綴,其餘文件須要後綴,支持*通配符匹配)
(3).refid 是對某處定義的一個<filelist>的引用。
注意 dir 和 files 都是必要的,除非指定了refid(這種狀況下,dir和files都不容許使用)。
例如:(filelist中通配符要用*,好像不支持xx*,或者*.xxx的用法,另外files引入class文件的時候不能寫後綴.class,只能寫文件名字)
<project name="HelloWorld" default="" basedir=""> <filelist id="filelist1" dir="C:/Users/liqiang/Desktop" files="*"></filelist> <path id="myclass.classpath"> <filelist refid="filelist1"></filelist> </path> <path id="myclass.classpath1" refid="myclass.classpath"></path> <java classname="Mytest" classpathref="myclass.classpath1" fork="true"> <arg value="1 2 3 '4'"/> </java> </project>
與之等價的XML:
<project name="HelloWorld" default="" basedir=""> <filelist id="filelist1" dir="C:/Users/liqiang/Desktop" files="Mytest"></filelist> <path id="myclass.classpath"> <filelist refid="filelist1"></filelist> </path> <path id="myclass.classpath1" refid="myclass.classpath"></path> <java classname="Mytest" classpathref="myclass.classpath1" fork="true"> <arg value="1 2 3 '4'"/> </java> </project>
若是是jar文件須要寫文件後綴
<project name="HelloWorld" default="" basedir=""> <filelist id="filelist1" dir="C:/Users/liqiang/Desktop/antProject" files="tt.jar"></filelist> <path id="myclass.classpath"> <filelist refid="filelist1"></filelist> </path> <path id="myclass.classpath1" refid="myclass.classpath"></path> <java classname="Mytest" classpathref="myclass.classpath1" fork="true"> <arg value="1 2 3 '4'"/> </java> </project>
Fileset 數據類型定義了一組文件,並一般表示爲<fileset>元素。不過,許多ant任務構建成了隱式的fileset,這說明他們支持全部的fileset屬性和嵌套元素。如下爲fileset 的屬性列表。
(1).dir表示fileset 的基目錄。
(2).casesensitive的值若是爲false,那麼匹配文件名時,fileset不是區分大小寫的,其默認值爲true。
(3).defaultexcludes 用來肯定是否使用默認的排除模式,默認爲true。
(4).excludes 是用逗號分隔的須要派出的文件模式列表。
(5).excludesfile 表示每行包含一個排除模式的文件的文件名。
(6).includes 是用逗號分隔的,須要包含的文件模式列表。
(7).includesfile 表示每行包括一個包含模式的文件名。
例如:引入class文件
<project name="HelloWorld" default="" basedir=""> <fileset id="fileset1" dir="./"> <include name="Mytest" /> </fileset> <path id="myclass.classpath"> <fileset refid="fileset1"></fileset> </path> <path id="myclass.classpath1" refid="myclass.classpath"></path> <java classname="Mytest" classpathref="myclass.classpath1" fork="true"> <arg value="1 2 3 '4'"/> </java> </project>
與之等價的腳本:
<project name="HelloWorld" default="" basedir=""> <fileset id="fileset1" dir="./" includesfile="Mytest.class"></fileset> <path id="myclass.classpath"> <fileset refid="fileset1"></fileset> </path> <path id="myclass.classpath1" refid="myclass.classpath"></path> <java classname="Mytest" classpathref="myclass.classpath1" fork="true"> <arg value="1 2 3 '4'"/> </java> </project>
id:定義惟一的ID
refid:引用其餘的dirset的id
dir:表示目錄的位置
例如:(下面定義了dirset與path,用經過refid引入了其餘dirset與path)
<project name="HelloWorld" default="" basedir=""> <dirset id="basedirset" dir="./"></dirset> <path id="myclass.classpath"> <dirset refid="basedirset"></dirset> </path> <path id="myclass.classpath1" refid="myclass.classpath"></path> <java classname="Mytest" classpathref="myclass.classpath1" fork="true"> <arg value="1 2 3 '4'"/> </java> </project>
例以下面腳本將桌面的class文件包含到 basedirset 中:
<project name="HelloWorld" default="" basedir=""> <dirset id="basedirset" dir="C:/Users/liqiang/Desktop/"> <include name="*.class"/> </dirset> <path id="myclass.classpath"> <dirset refid="basedirset"></dirset> </path> <path id="myclass.classpath1" refid="myclass.classpath"></path> <java classname="Mytest" classpathref="myclass.classpath1" fork="true"> <arg value="1 2 3 '4'"/> </java> </project>
任何工具都會集成到開發工具中,像SVN,maven,git都與eclipse集成,固然ant也不例外。下面會在eclipse中使用ant。
通常版本直接集成了ant,因此直接使用便可。
工程結構以下:
輸入如下腳本進行測試:
<?xml version="1.0" encoding="UTF-8"?> <project name="HelloWorld" default="test" basedir=""> <target name="test"> <echo message="Hello, world"/> <echo message="This is info message." level="info" /> </target> </project>
Buildfile: E:\xiangmu\MavenProject\build.xml
test:
[echo] Hello, world
[echo] This is info message.
BUILD SUCCESSFUL
Total time: 1 second
ant.properties
name=username
password=userpassword
build.xml腳本:
<?xml version="1.0" encoding="UTF-8"?> <project name="HelloWorld" default="test" basedir=""> <property file="ant.properties"></property> <target name="test"> <echo message="${name}" /> <echo message="${password}" level="info" /> </target> </project>
結果:
Buildfile: E:\xiangmu\MavenProject\build.xml test: [echo] username [echo] userpassword BUILD SUCCESSFUL Total time: 1 second
(1)打包ant視圖: window->show view
(2)空白處右擊而後add buildfiles
(3)選中咱們的build.xml
(4)直接雙擊test運行該target便可。
能夠設置須要執行的target以及JRE等參數:(能夠選擇多個target進行執行)
上面配置至關於設置了快捷方式,運行的時候點擊下面便可:(至關於運行指定build.xml的默認target)
eclipse選中如圖位置:External xxx....
配置ant的jre版本:
在運行時修改ant 的運行時輸出編碼,咱們添加(<sysproperty key="file.encoding" value="UTF-8" />) 後,控制檯就能夠正常顯示中文了,以下:
<!-- =================================
target: precompile
================================= -->
<target name="precompile" description="--> description">
<!--compile JSP-->
<java classname="weblogic.jspc" classpathref="wls.classpath" fork="true" failonerror="yes" maxmemory="1028m">
<sysproperty key="file.encoding" value="utf-8"/>
<arg line="-advanced" />
</java>
</target>
<path id="wls.classpath"> <fileset dir="${wls_home}/server/lib"> <include name="*.jar" /> </fileset> <dirset dir="./build/classes"> </dirset> </path>
上面dirset等同於下面配置:(fileset能夠jar能夠class)
<fileset dir="E:/xiangmu/WebTest/WebContent/WEB-INF/classes"
includes="*.class">
</fileset>
補充:build.xml中basedir能夠定義一個全局的位置變量,.表明當前位置,例如
<project name="exam" default="default" basedir="."> <target name="default"> <echo message="${basedir}"/> </target> </project>
結果:
Buildfile: E:\xiangmu\Exam\build.xml
default:
[echo] E:\xiangmu\Exam
BUILD SUCCESSFUL
Total time: 358 milliseconds
補充:好像ant1.10.5須要JDK8支持,而ant1.9.13支持JDK7