Home

2008年7月1日 星期二

[教學] ANT 的基本介紹

來源: 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:
文字說明

屬性說明是否必要
nametarget 的名稱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 執行, 如下圖



參考文獻:

良葛格學習筆記:
http://caterpillar.onlyfun.net/Gossip/JUnit/JUnitGossip.htm

Ant 使用手冊:
http://ant.apache.org/manual/index.html

PHP教學課程:
http://php.igt.com.tw/




1 則留言:

  1. It will help only as part of a thorough cleaning process. The package includes a shampoo, a purifier, and a conditioner. When used together, these components promise to remove chemicals and medications from the hair shaft while keeping your hair quality intact. The internet will tell you about several home remedies, including washing your hair with apple cider vinegar or lemon juice and detergent. However, none of these would have the strength to penetrate your hair shaft and cleanse it from underneath the upper layers in the strands of hair. Take the other half the same way as you did the first

    回覆刪除