ANT简明教程[转载]
一、ant關(guān)鍵元素
1. project元素
??? project 元素是 Ant 構(gòu)件文件的根元素, Ant 構(gòu)件文件至少應(yīng)該包含一個(gè) project 元素,否則會(huì)發(fā)生錯(cuò)誤。在每個(gè) project 元素下,可包含多個(gè) target 元素。接下來向讀者展示一下 project 元素的各屬性。
1)?name?屬性
??? 用于指定 project 元素的名稱。
2)?default?屬性
??? 用于指定 project 默認(rèn)執(zhí)行時(shí)所執(zhí)行的 target 的名稱。
3)?basedir?屬性
??? 用于指定基路徑的位置。該屬性沒有指定時(shí),使用 Ant 的構(gòu)件文件的附目錄作為基準(zhǔn)目錄。
<?xml version="1.0" ?> <project name ="antPro" default ="getBaseDir" basedir ="C:/ThinkInJavaCode"><target name="getBaseDir"><echo message="The base dir is: ${basedir}"/></target> </project>??? 從上例可以看出,在這里定義了default 屬性的值為getBaseDir ,即當(dāng)運(yùn)行ant 命令時(shí),如果沒有指明待執(zhí)行的target,則將執(zhí)行默認(rèn)的target--getBaseDir 。此外,還定義了basedir 屬性的值為 "C:/ThinkInJavaCode" ,進(jìn)入"C:/ThinkInJavaCode" 后運(yùn)行ant 命令,得一下結(jié)果:
Buildfile: C:\ThinkInJavaCode\build.xmlsayBaseDir:[echo] The base dir is: C:\ThinkInJavaCodeBUILD SUCCESSFUL Total time: 0 seconds2.?target?元素
?? target為Ant的基本執(zhí)行單元,它可以包含一個(gè)或多個(gè)具體的任務(wù)。多個(gè)target 可以存在相互依賴關(guān)系。它有如下屬性:
1)?name?屬性
??? 指定 target 元素的名稱,這個(gè)屬性在一個(gè) project 元素中是唯一的。我們可以通過指定 target 元素的名稱來指定某個(gè) target 。
2)?depends?屬性
??? 用于描述 target 之間的依賴關(guān)系,若與多個(gè) target 存在依賴關(guān)系時(shí),需要以“,”間隔。 Ant 會(huì)依照 depends 屬性中 target 出現(xiàn)的順序依次執(zhí)行每個(gè) target 。被依賴的 target 會(huì)先執(zhí)行。
3)?if?屬性
??? 用于驗(yàn)證指定的屬性是否存在,若不存在,所在 target 將不會(huì)被執(zhí)行。
4)?unless?屬性
??? 該屬性的功能與 if 屬性的功能正好相反,它也用于驗(yàn)證指定的屬性是否存在,若不存在,所在 target 將會(huì)被執(zhí)行。
5)?description?屬性
??? 該屬性是關(guān)于 target 功能的簡(jiǎn)短描述和說明。
??? 舉例說明如下:
<?xml version="1.0" ?> <project name ="targetPro" default="targetB"> <target name="targetA" if ="ant.java.version"> <echo message ="Java Version: ${ant.java.version}"/> </target> <target name="targetB" depends ="targetA" unless ="philander"> <description> a depend example! </description> <echo message ="The base dir is: ${basedir}"/> </target> </project>??? 從以下結(jié)果后可以看到,我們運(yùn)行的是名為 targetB 的target ,由于它依賴于targetA ,所以 targetA 將首先被執(zhí)行,同時(shí)因?yàn)橄到y(tǒng)配置了JDK,所以 ant.java.version 屬性存在,執(zhí)行了targetA,輸出信息:"[echo] Java Version: 1.6 ",targetA 執(zhí)行完畢后,接著執(zhí)行 targetB ,因?yàn)閜hilander不存在,而unless屬性是在不存在時(shí)進(jìn)入所在target 的,由此可知 targetB 得以執(zhí)行,輸出信息:"[echo] The base dir is: C:\ThinkInJavaCode"。
Buildfile: C:\ThinkInJavaCode\build.xmltargetA:[echo] Java Version: 1.6targetB:[echo] The base dir is: C:\ThinkInJavaCodeBUILD SUCCESSFUL Total time: 0 seconds3.?property?元素
??? 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.getPropertis() 方法得到的屬性一致,這些系統(tǒng)屬性可參考 sun 網(wǎng)站的說明。同時(shí), Ant 還提供了一些它自己的內(nèi)置屬性,如下:
??? basedir:project 基目錄的絕對(duì)路徑;???
??? ant.file:buildfile的絕對(duì)路徑,上例中ant.file值為C:\ThinkInJavaCode\build.xml;
??? ant.version:Ant 的版本信息,本文為1.8.1 ;
??? ant.project.name:當(dāng)前指定的project的名字,即前文說到的project的name屬性值;?
??? ant.java.version:Ant 檢測(cè)到的JDK版本,本文為 1.6 。
??? 舉例說明如下:
<? xml version="1.0" ?> <project name ="propertyPro" default ="example"><property name ="name" value ="philander"/><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è)屬性值。
二、ANT常用命令
1.?copy 命令
??? copy主要用來對(duì)文件和目錄的復(fù)制功能。舉例如下:
eg1. 復(fù)制單個(gè)文件:
<copy file="original.txt" tofile="copied.txt"/>eg2. 對(duì)文件目錄進(jìn)行復(fù)制:
<copy todir="../dest_dir"><fileset dir="src_dir"/></copy>eg3. 將文件復(fù)制到另外的目錄:
<copy file="source.txt" todir="../home/philander"/>2.?delete?命令
??? 對(duì)文件或目錄進(jìn)行刪除,舉例如下:
eg1. 刪除某個(gè)文件:
<delete file="/home/photos/philander.jpg"/>eg2. 刪除某個(gè)目錄:
<delete dir="/home/photos"/>eg3. 刪除所有的備份目錄或空目錄:
<delete includeEmptyDirs="true"><fileset dir="." includes="**/*.bak"/> </delete>3.?mkdir?命令
??? 創(chuàng)建目錄。 eg :
<mkdir dir="/home/philander/build/classes"/>4.?move?命令
??? 移動(dòng)文件或目錄,舉例如下:
eg1. 移動(dòng)單個(gè)文件:
<move file="sourcefile" tofile=”destfile”/>eg2. 移動(dòng)單個(gè)文件到另一個(gè)目錄:
<move file="sourcefile" todir=”movedir”/>eg3. 移動(dòng)某個(gè)目錄到另一個(gè)目錄:
<move todir="newdir"> <fileset dir="olddir"/></move>
5.?echo?命令
??? 該任務(wù)的作用是根據(jù)日志或監(jiān)控器的級(jí)別輸出信息。它包括 message 、 file 、 append 和 level 四個(gè)屬性,舉例如下
<echo message="Hello,ANT" file="/home/philander/logs/ant.log" append="true">三、利用ant?構(gòu)建和部署Java項(xiàng)目
??? Ant 可以代替使用 javac 、 java 和 jar 等命令來執(zhí)行 java 操作,從而達(dá)到輕松的構(gòu)建和部署 Java 項(xiàng)目的目的。
1.?利用ant?的javac命令來編譯Java程序
??? Ant 的javac命令用于實(shí)現(xiàn)編譯Java 程序的功能。下面來看一個(gè)簡(jiǎn)單的例子:首先我們建立名為 JavaTestPro的Java項(xiàng)目,建立src目錄為源代碼目錄,在src目錄下建立HelloWorld.java這個(gè)類文件。該類文件的內(nèi)容如下:
public class HelloWorld {public static void main(String[] args) {System.out.println("hello world!");} }??? 同時(shí)在JavaTestPro項(xiàng)目的根目錄下建立build.xml 文件,在該文件中編譯sr 目錄下的Java文件,并將編譯后的class文件放入build/classes 目錄中,整個(gè)項(xiàng)目的目錄結(jié)構(gòu)如下:
|JavaTestPro
????? |src
????? |build
??????????? |classes
????? |build.xml
???? 在編譯前,需清除classes 目錄,該文件的內(nèi)容如下:
<?xml version="1.0" ?><project name ="javacTest" default="compile" basedir="."><target name="clean"><delete dir="${basedir}/build"/></target><target name="compile" depends ="clean"><mkdir dir ="${basedir}/build/classes"/><javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/></target> </project>??? 在項(xiàng)目根目錄(C:\ThinkInJavaCode\JavaTestPro)執(zhí)行ant命令后,可在該目錄下發(fā)現(xiàn)新生成的build/classes子目錄,編譯后生成的HelloWorld.class文件就在該目錄下。
2.?使用java命令執(zhí)行Java程序
??? Ant 中可以使用 java命令實(shí)現(xiàn)運(yùn)行Java程序的功能??梢栽谏厦娴腷uild.xml基礎(chǔ)上做修改來實(shí)現(xiàn):
<?xml version="1.0" ?> <project name ="javacTest" default="run" basedir="."><target name="clean"><delete dir="${basedir}/build"/></target><target name="compile" depends ="clean"><mkdir dir ="${basedir}/build/classes"/><javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/></target><target name="run" depends ="compile"><java classname ="HelloWorld"><classpath><pathelement path="${basedir}/build/classes"/></classpath></java></target> </project>接著,就可以在控制臺(tái)看見輸出:"[java] hello world!"
3.?使用jar命令生成jar文件
??? 還可以在上例的基礎(chǔ)上更進(jìn)一步,來生成jar包,可在run 這個(gè) target 下再加上如下 target :
<?xml version="1.0" ?> <project name ="javacTest" default="jar" basedir="."><target name="clean"><delete dir="${basedir}/build"/></target><target name="compile" depends ="clean"><mkdir dir ="${basedir}/build/classes"/><javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/></target><target name="run" depends="compile"><java classname ="HelloWorld"><classpath><pathelement path="${basedir}/build/classes"/></classpath></java></target><target name="jar" depends="run"><jar destfile="helloworld.jar" basedir="${basedir}/build/classes"><manifest><attribute name="Main-class" value="HelloWorld"/></manifest></jar></target > </project>??? 其中,project的default 屬性設(shè)置為應(yīng)設(shè)為jar,ant運(yùn)行完畢后,可看到在項(xiàng)目的根目錄下生成了一個(gè) helloworld.jar的jar包 ??赏ㄟ^運(yùn)行以下命令來執(zhí)行該jar包:
java -jar helloworld.jar4.?使用war命令打包JavaEE項(xiàng)目
??? 建立一個(gè)JavaEE項(xiàng)目,其中src 為Java源代碼目錄,WebContent為各jsp存放目錄,lib 為項(xiàng)目引用的的包的目錄。在WebTest項(xiàng)目目錄下建立了build.xml 文件,該文件為該工程的 Ant 構(gòu)件文件。
|WebContent
??? |src
??? |build
??????? |classes
??? |WebContent
??????? |META-INF
??????????? |MANIFEST.MF
??????? |WEB-INF
??????????? |lib
??????????? |classes
??????? |HelloJSP.jsp
??? |build.xml
??? 讀者可以 src 目錄下放入在前續(xù)例子中開發(fā)的 HelloWorld.java 文件,并在 WebContent下建立 HelloJSP.jsp 文件,其內(nèi)容很簡(jiǎn)單,就是輸出 Hello 信息,代碼如下所示:
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>war test for ant</title> </head> <body>Hello JSP!Hello Ant! </body> </html>??? 接下來編寫 build.xml 文件,其內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8" ?> <project name ="WebTest" default ="war" basedir ="."><property name ="classes" value ="${basedir}/build/classes"/><property name ="build" value ="${basedir}/build"/><property name ="lib" value ="${basedir}/WebContent/WEB-INF/lib"/><!-- 刪除build 路徑--><target name ="clean"><delete dir ="${build}"/></target><!-- 建立build/classes 路徑,并編譯class 文件到build/classes 路徑下--><target name ="compile" depends ="clean"><mkdir dir ="${classes}"/><javac srcdir ="${basedir}/src" destdir ="${classes}"/></target><!-- 打war 包--><target name ="war" depends ="compile"><war destfile ="${build}/WebTest.war" webxml ="${basedir}/WebContent/WEB-INF/web.xml"><!-- 拷貝WebRoot 下除了WEB-INF 和META-INF 的兩個(gè)文件夾--><fileset dir ="${basedir}/WebContent" includes ="**/*.jsp"/><!-- 拷貝lib 目錄下的jar 包--><lib dir ="${lib}"/><!-- 拷貝build/classes 下的class 文件--><classes dir ="${classes}"/></war></target> </project>???? 在C:\ThinkInJavaCode\WebTest目錄下運(yùn)行ant后,就生成了WebTest.war 文件了,然后可以將其放入Web容器(如Tomcat)的相應(yīng)目錄下(${Tomcata安裝目錄}\webapps)運(yùn)行該web項(xiàng)目了。
轉(zhuǎn)載于:https://www.cnblogs.com/superjt/p/3578776.html
總結(jié)
以上是生活随笔為你收集整理的ANT简明教程[转载]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Species Tree(HashTab
- 下一篇: 分布式概念与协议