一、ant關鍵元素
1. project元素
project 元素是 Ant 構件文件的根元素, Ant 構件文件至少應該包含一個 project 元素,否則會發生錯誤。在每個 project 元素下,可包含多個 target 元素。接下來向讀者展示一下 project 元素的各屬性。
1) name 屬性
用于指定 project 元素的名稱。
2) default 屬性
用于指定 project 默認執行時所執行的 target 的名稱。
3) basedir 屬性
用于指定基路徑的位置。該屬性沒有指定時,使用 Ant 的構件文件的附目錄作為基準目錄。
<?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 ,即當運行ant 命令時,如果沒有指明待執行的target,則將執行默認的target--getBaseDir 。此外,還定義了basedir 屬性的值為 "C:/ThinkInJavaCode" ,進入"C:/ThinkInJavaCode" 后運行ant 命令,得一下結果:
Buildfile: C:\ThinkInJavaCode\build.xml sayBaseDir: [echo] The base dir is: C:\ThinkInJavaCode BUILD SUCCESSFUL Total time: 0 seconds
2. target 元素
target為Ant的基本執行單元,它可以包含一個或多個具體的任務。多個target 可以存在相互依賴關系。它有如下屬性:
1) name 屬性
指定 target 元素的名稱,這個屬性在一個 project 元素中是唯一的。我們可以通過指定 target 元素的名稱來指定某個 target 。
2) depends 屬性
用于描述 target 之間的依賴關系,若與多個 target 存在依賴關系時,需要以“,”間隔。 Ant 會依照 depends 屬性中 target 出現的順序依次執行每個 target 。被依賴的 target 會先執行。
3) if 屬性
用于驗證指定的屬性是否存在,若不存在,所在 target 將不會被執行。
4) unless 屬性
該屬性的功能與 if 屬性的功能正好相反,它也用于驗證指定的屬性是否存在,若不存在,所在 target 將會被執行。
5) description 屬性
該屬性是關于 target 功能的簡短描述和說明。
舉例說明如下:
<?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>
從以下結果后可以看到,我們運行的是名為 targetB 的target ,由于它依賴于targetA ,所以 targetA 將首先被執行,同時因為系統配置了JDK,所以 ant.java.version 屬性存在,執行了targetA,輸出信息:"[echo] Java Version: 1.6 ",targetA 執行完畢后,接著執行 targetB ,因為philander不存在,而unless屬性是在不存在時進入所在target 的,由此可知 targetB 得以執行,輸出信息:"[echo] The base dir is: C:\ThinkInJavaCode"。
Buildfile: C:\ThinkInJavaCode\build.xml targetA: [echo] Java Version: 1.6 targetB: [echo] The base dir is: C:\ThinkInJavaCode BUILD SUCCESSFUL Total time: 0 seconds
3. property 元素
property元素可看作參量或者參數的定義,project 的屬性可以通過 property 元素來設定,也可在 Ant 之外設定。若要在外部引入某文件,例如 build.properties 文件,可以通過如下內容將其引入:
<property file=” build.properties”/>
property 元素可用作 task 的屬性值。在 task 中是通過將屬性名放在“ ${ ”和“ } ”之間,并放在 task 屬性值的位置來實現的。
Ant 提供了一些內置的屬性,它能得到的系統屬性的列表與 Java 文檔中 System.getPropertis() 方法得到的屬性一致,這些系統屬性可參考 sun 網站的說明。同時, Ant 還提供了一些它自己的內置屬性,如下:
basedir:project 基目錄的絕對路徑;
ant.file:buildfile的絕對路徑,上例中ant.file值為C:\ThinkInJavaCode\build.xml;
ant.version:Ant 的版本信息,本文為1.8.1 ;
ant.project.name:當前指定的project的名字,即前文說到的project的name屬性值;
ant.java.version:Ant 檢測到的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>
上例中用戶設置了名為name 和age的兩個屬性,這兩個屬性設置后,在下文中可以通過 ${name} 和 ${age} 分別取得這兩個屬性值。
二、ANT常用命令
1. copy 命令
copy主要用來對文件和目錄的復制功能。舉例如下:
eg1. 復制單個文件:
<copy file="original.txt" tofile="copied.txt"/>
eg2. 對文件目錄進行復制:
<copy todir="../dest_dir"> <fileset dir="src_dir"/> </copy>
eg3. 將文件復制到另外的目錄:
<copy file="source.txt" todir="../home/philander"/>
2. delete 命令
對文件或目錄進行刪除,舉例如下:
eg1. 刪除某個文件:
<delete file="/home/photos/philander.jpg"/>
eg2. 刪除某個目錄:
<delete dir="/home/photos"/>
eg3. 刪除所有的備份目錄或空目錄:
<delete includeEmptyDirs="true"> <fileset dir="." includes="**/*.bak"/> </delete>
3. mkdir 命令
創建目錄。 eg :
<mkdir dir="/home/philander/build/classes"/>
4. move 命令
移動文件或目錄,舉例如下:
eg1. 移動單個文件:
<move file="sourcefile" tofile=”destfile”/>
eg2. 移動單個文件到另一個目錄:
<move file="sourcefile" todir=”movedir”/>
eg3. 移動某個目錄到另一個目錄:
<move todir="newdir"> <fileset dir="olddir"/></move>
5. echo 命令
該任務的作用是根據日志或監控器的級別輸出信息。它包括 message 、 file 、 append 和 level 四個屬性,舉例如下
<echo message="Hello,ANT" file="/home/philander/logs/ant.log" append="true">
三、利用ant 構建和部署Java項目
Ant 可以代替使用 javac 、 java 和 jar 等命令來執行 java 操作,從而達到輕松的構建和部署 Java 項目的目的。
1. 利用ant 的javac命令來編譯Java程序
Ant 的javac命令用于實現編譯Java 程序的功能。下面來看一個簡單的例子:首先我們建立名為 JavaTestPro的Java項目,建立src目錄為源代碼目錄,在src目錄下建立HelloWorld.java這個類文件。該類文件的內容如下:
public class HelloWorld { public static void main(String[] args) { System.out.println("hello world!"); } }
同時在JavaTestPro項目的根目錄下建立build.xml 文件,在該文件中編譯sr 目錄下的Java文件,并將編譯后的class文件放入build/classes 目錄中,整個項目的目錄結構如下:
|JavaTestPro
|src
|build
|classes
|build.xml
在編譯前,需清除classes 目錄,該文件的內容如下:
<?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>
在項目根目錄(C:\ThinkInJavaCode\JavaTestPro)執行ant命令后,可在該目錄下發現新生成的build/classes子目錄,編譯后生成的HelloWorld.class文件就在該目錄下。
2. 使用java命令執行Java程序
Ant 中可以使用 java命令實現運行Java程序的功能。可以在上面的build.xml基礎上做修改來實現:
<?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>
接著,就可以在控制臺看見輸出:"[java] hello world!"
3. 使用jar命令生成jar文件
還可以在上例的基礎上更進一步,來生成jar包,可在run 這個 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 屬性設置為應設為jar,ant運行完畢后,可看到在項目的根目錄下生成了一個 helloworld.jar的jar包 。可通過運行以下命令來執行該jar包:
java -jar helloworld.jar
4. 使用war命令打包JavaEE項目
建立一個JavaEE項目,其中src 為Java源代碼目錄,WebContent為各jsp存放目錄,lib 為項目引用的的包的目錄。在WebTest項目目錄下建立了build.xml 文件,該文件為該工程的 Ant 構件文件。
|WebContent
|src
|build
|classes
|WebContent
|META-INF
|MANIFEST.MF
|WEB-INF
|lib
|classes
|HelloJSP.jsp
|build.xml
讀者可以 src 目錄下放入在前續例子中開發的 HelloWorld.java 文件,并在 WebContent下建立 HelloJSP.jsp 文件,其內容很簡單,就是輸出 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 文件,其內容如下:
<?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 的兩個文件夾--> <fileset dir ="${basedir}/WebContent" includes ="**/*.jsp"/> <!-- 拷貝lib 目錄下的jar 包--> <lib dir ="${lib}"/> <!-- 拷貝build/classes 下的class 文件--> <classes dir ="${classes}"/> </war> </target> </project>
在C:\ThinkInJavaCode\WebTest目錄下運行ant后,就生成了WebTest.war 文件了,然后可以將其放入Web容器(如Tomcat)的相應目錄下(${Tomcata安裝目錄}\webapps)運行該web項目了。
![]() |
不含病毒。www.avast.com |