來源: Polin Wei
Ant 的全名是"Another Neat Tool",Ant主要可以幫您自動完成下列的任務:
- 編譯Java原始碼
- 建立jar、war、zip檔案
- 自動測試與生成報告
- 從 CVS 或 SVN 等管理系統取得原始碼
所以若你對 Java 程式沒有任何興趣的話,那就可以先離開了,不然會很無聊.
環境:
OS: WinXPSP2
程式版本:
Java : jdk1.5.0_12 程式放在 D:\Progs\jdk1.5.0_12
Ant: ant-1.7.0 程式放在 C:\AppServ\apache-ant-1.7.0
增加系統變數:
%JAVA_HOME% = D:\Progs\jdk1.5.0_12
%ANT_HOME% = C:\AppServ\apache-ant-1.7.0
增加路徑:
PATH=%ANT_HOME%\bin;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
以上的環境設定好後,可以在 Command Prompt 中來測試一下 Ant 是否正常運作.
project 節點:
project 節點是 build.xml 的文件根節點。一個文件之中,只能有一個根節點。project 節點有以下三個屬性。
name:(必要:No)
專案名稱
default:(必要:Yes)
假設命令列未指定 target 時,預設執行的 target 節點
basedir:(必要:No)
用來指定專案的根目錄,這個屬性可以使用"basedir" property 節點來改變,如果定義 basedir的 property 節點,在 project 標籤中,就不可以定義這個屬性。假使未使用這個屬性或 property 節點來定義 basedir的話,則 Ant 會使用這個專案 build.xml 的目錄,作為 basedir。
屬性 | 說明 | 是否必要 |
name | 專案名稱 | No |
default | 假設命令列未指定 target 時,預設執行的 target 節點 | Yes. |
basedir | 用來指定專案的根目錄,這個屬性可以使用"basedir" property 節點來改變,如果定義 basedir的 property 節點,在 project 標籤中,就不可以定義這個屬性。假使未使用這個屬性或 property 節點來定義 basedir的話,則 Ant 會使用這個專案 build.xml 的目錄,作為 basedir。 | No |
target 節點:
target 節點是 Ant 執行的目標,我們可以把各種命令(在 Ant 中的術語,叫任務 task),放在 target 的節點中。所以,你可以把他想成是一組命令的結合,以程式設計來說,接近副程式或不傳回值的函式。
target 和 target 之間,可以使用 depends屬性來定義彼此間的依存關係。藉由定義這些依存的關係,我們可以改變 target 的執行順序。也可以定義 if 以及 unless 屬性,來決定是否執行這個 target 節點的工作。沒有定義 if 和 unless 屬性的 target 節點,一定會按照順序執行。
name:target 的名稱
depends:
在執行這個 target 節點之前,先要執行其他節點的名稱。如果是多個節點時,以逗號區隔各個節點。
if:
指定 property 名稱。必須定義這個 property ,才會執行這個 target的工作。
unless:
指定 property 名稱。必須不定義這個 property ,才會執行這個 target的工作。
description:
文字說明
屬性 | 說明 | 是否必要 |
name | target 的名稱 | Yes |
depends | 在執行這個 target 節點之前,先要執行其他節點的名稱。如果是多個節點時,以逗號區隔各個節點。 | No |
if | 指定 property 名稱。必須定義這個 property ,才會執行這個 target的工作。 | No |
unless | 指定 property 名稱。必須不定義這個 property ,才會執行這個 target的工作。 | No |
description | 文字說明 | No |
task 節點:
task 節點,是 Ant 執行工作最基本的單位,類似程式設計中的命令句。可分為 core tasks 和 optional tasks 兩類,你也可以使用 java 來撰寫自定的 task。
task 的範圍很廣,各個屬性也不相同,要運用 task時,可參考 Ant 的線上說明。
property 節點:
property 節點,定義專案的屬性值,類似程式設計中的變數。最常用的屬性有 name 和 value。name 定義這個 property 的名稱,value 定義這個property 的值。要讀取 property 的值時,必須使用 ${property名稱}的格式。
整理一下:在 Ant 的 buildfile 中可以定義構建專案時的「屬性」(property)、「任務」(task),一個build.xml中可以定義多個任務,這些任務可能是建立目錄、編譯Java原始碼、搬移檔案、產生doc文件、進行測試、產生測試報告等等,這些任務通常組織為一個「目標」(target)。
現在我們就來建立一個實際的專案及一個簡單的 build.xml 檔作測試
專案名:test (這是一個 struts 架構)
JBoss: jboss-4.0.3SP1
專案架構如下圖:
build.xml 檔案內容如下:
<?xml version="1.0" encoding="UTF-8"?> <project basedir="." default="build" name="test"> <property environment="env"/> <property name="ECLIPSE_HOME" value="../../Progs/eclipse-ganymede"/> <property name="JBOSS_HOME" value="C:/AppServ/jboss-4.0.3SP1" /> <property name="server.publish.dir" value="${JBOSS_HOME}/server/default/deploy/" />=> 定義 JBoss 存放專案的地方 <property name="debuglevel" value="source,lines,vars"/> <property name="target" value="1.5"/> <property name="source" value="1.5"/> <path id="JBoss v4.0 [JBoss v4.0].libraryclasspath"> => 這個專案所需要的 JAR 檔 <pathelement location="${JBOSS_HOME}/client/jboss-j2ee.jar" /> <pathelement location="${JBOSS_HOME}/client/jbossall-client.jar" /> <pathelement location="${JBOSS_HOME}/server/default/lib/javax.servlet.jar" /> <pathelement location="${JBOSS_HOME}/server/default/lib/javax.servlet.jsp.jar" /> <pathelement location="${JBOSS_HOME}/server/default/lib/activation.jar" /> <pathelement location="${JBOSS_HOME}/server/default/lib/mail.jar" /> </path> <path id="Web App Libraries.libraryclasspath">=>在 WebContent 中要包含的 JAR 檔 <pathelement location="WebContent/WEB-INF/lib/NCSO.jar"/> <pathelement location="WebContent/WEB-INF/lib/activation.jar"/> <pathelement location="WebContent/WEB-INF/lib/common-annotations.jar"/> <pathelement location="WebContent/WEB-INF/lib/commons-beanutils-bean-collections.jar"/> <pathelement location="WebContent/WEB-INF/lib/commons-beanutils.jar"/> <pathelement location="WebContent/WEB-INF/lib/commons-collections-3.1.jar"/> <pathelement location="WebContent/WEB-INF/lib/commons-dbcp-1.2.2.jar"/> <pathelement location="WebContent/WEB-INF/lib/commons-digester-1.7.jar"/> <pathelement location="WebContent/WEB-INF/lib/commons-digester.jar"/> <pathelement location="WebContent/WEB-INF/lib/commons-fileupload.jar"/> <pathelement location="WebContent/WEB-INF/lib/commons-io-1.3.1.jar"/> <pathelement location="WebContent/WEB-INF/lib/commons-javaflow-20060411.jar"/> <pathelement location="WebContent/WEB-INF/lib/commons-lang.jar"/> <pathelement location="WebContent/WEB-INF/lib/commons-logging-api.jar"/> <pathelement location="WebContent/WEB-INF/lib/commons-logging.jar"/> <pathelement location="WebContent/WEB-INF/lib/commons-pool-1.2.jar"/> <pathelement location="WebContent/WEB-INF/lib/commons-validator.jar"/> <pathelement location="WebContent/WEB-INF/lib/itext-1.3.1.jar"/> <pathelement location="WebContent/WEB-INF/lib/jakarta-oro.jar"/> <pathelement location="WebContent/WEB-INF/lib/jasperreports-1.3.4.jar"/> <pathelement location="WebContent/WEB-INF/lib/jdbc2_0-stdext.jar"/> <pathelement location="WebContent/WEB-INF/lib/jstl.jar"/> <pathelement location="WebContent/WEB-INF/lib/jxl.jar"/> <pathelement location="WebContent/WEB-INF/lib/log4j-1.2.11.jar"/> <pathelement location="WebContent/WEB-INF/lib/mail.jar"/> <pathelement location="WebContent/WEB-INF/lib/ocrs12.zip"/> <pathelement location="WebContent/WEB-INF/lib/ojdbc14.jar"/> <pathelement location="WebContent/WEB-INF/lib/ojdbc14_g.jar"/> <pathelement location="WebContent/WEB-INF/lib/p6spy.jar"/> <pathelement location="WebContent/WEB-INF/lib/png-encoder-1.5.jar"/> <pathelement location="WebContent/WEB-INF/lib/poi-3.0.1-FINAL-20070705.jar"/> <pathelement location="WebContent/WEB-INF/lib/quartz-1.5.2.jar"/> <pathelement location="WebContent/WEB-INF/lib/standard.jar"/> <pathelement location="WebContent/WEB-INF/lib/struts-legacy.jar"/> <pathelement location="WebContent/WEB-INF/lib/struts.jar"/> </path> <path id="EAR Libraries.libraryclasspath"/> <path id="test.classpath"> => 這是重點, 此專案中所有 Java compile 成 class 檔 , 只要deploy Class 檔即可 <pathelement location="WebContent/WEB-INF/classes"/> <path refid="JBoss v4.0 [JBoss v4.0].libraryclasspath"/> <path refid="Web App Libraries.libraryclasspath"/> <path refid="EAR Libraries.libraryclasspath"/> </path> <target name="init"> => ANT Compile 的進入點 <mkdir dir="WebContent/WEB-INF/classes"/> <copy includeemptydirs="false" todir="WebContent/WEB-INF/classes"> <fileset dir="src" excludes="**/*.launch, **/*.java"/> </copy> </target> <target name="clean"> => ANT compile 完後, 將 class 檔刪除 <delete dir="WebContent/WEB-INF/classes"/> </target> <target depends="clean" name="cleanall"/> <target depends="build-subprojects,build-project" name="build"/> <target name="build-subprojects"/> <target depends="init" name="build-project"> => 開始建立整個專案 <echo message="${ant.project.name}: ${ant.file}"/> <javac deprecation="no" nowarn="true" encoding="UTF-8" debug="true" debuglevel="${debuglevel}" destdir="WebContent/WEB-INF/classes" source="${source}" target="${target}"> <src path="src"/> <classpath refid="test.classpath"/> </javac> <jar destfile="${ant.project.name}.war"> => 把整個專案包成一個 .war 檔 <zipfileset dir="WebContent/"> <include name="**/*.*" /> <exclude name="**/*.war" /> </zipfileset> </jar> <move file="${ant.project.name}.war" todir="${server.publish.dir}" /> => 將 .war 檔 copy 到 JBoss 的目錄 "C:/AppServ/jboss-4.0.3SP1/server/default/deploy/" </target> <target description="Build all projects which reference this project. Useful to propagate changes." name="build-refprojects"/> <target description="copy Eclipse compiler jars to ant lib directory" name="init-eclipse-compiler"> <copy todir="${ant.library.dir}"> <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/> </copy> <unzip dest="${ant.library.dir}"> <patternset includes="jdtCompilerAdapter.jar"/> <fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/> </unzip> </target> <target description="compile project with Eclipse compiler" name="build-eclipse-compiler"> <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/> <antcall target="build"/> </target> </project> |
我與小崴崴的工作日記: [教學] ANT 的基本介紹
Ant 使用手冊:
http://ant.apache.org/manual/index.html
留言列表