孤楓舞影

          Victory won't come to me unless I go to it.

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            5 Posts :: 0 Stories :: 2 Comments :: 0 Trackbacks

          Ant教程(一)

          本文以最新發布的Ant 1.7.1為例,介紹這款優秀的Build工具的安裝配置、基本應用和一些高級話題。最新的Ant下載地址是 http://jakarta.apache.org/ant/

          Ant是一種基于Java的Build工具。理論上來說,它有些類似于C中的make,但比make優越。現在存在的大多數Build工具,如make、gnumake、nmake、jam等都存在這樣或那樣的不足,比如依賴于特定的平臺、配置文件過于復雜或者對格式無法檢查而容易出錯等。與這些工具相比較,Ant的兩個特性決定了它是一款優秀的Build工具:

          1. 基于Java的實現。具有良好的跨平臺性,同時可以通過增加新的Java類來擴展Ant的功能,而無需去了解不同平臺上不同的腳本語言。

          2.基于XML的配置文件。Ant以XML樹來描述Target/Task的關系,文件結構清晰、易讀易寫,并且利用XML對格式的控制來避免由于配置文件的錯誤造成的Build操作失敗。

          安裝與配置

          Ant的安裝非常簡單,把從網上下載的jakarta-ant-1.5.1-bin.zip解開到一個目錄下即可(以下假定安裝在目錄D:\jakarta-ant-1.5.1)。接下來需要進行環境變量配置:

          SET ANT_HOME=D:\jakarta-ant-1.5.1 //注意是Ant的安裝目錄,不是bin子目錄
          SET PATH=%PATH%;%ANT_HOME%\bin;


          在配置環境變量之前,請確認已經正確設置了JAVA_HOME系統變量。輸入ant命令,看到如下輸出說明已成功安裝了Ant工具:

          Buildfile: build.xml does not exist!
          Build failed


          提示信息表明在當前目錄不存在build.xml配置文件,但這本身已經說明Ant成功運行了。

          快速入門

          下面用一個最簡單也是最經典的例子-HelloWorld來感受一下Ant吧。

          //HelloWorld.java
          package com.sharetop.antdemo;
          public class HelloWorld {
          public static void main( String args[] ) {
          System.out.println("Hello world. ");
          }
          }


          要讓Ant編譯這個文件,首先需要編寫一個Build配置文件。在一般情況下,這個文件被命名為build.xml。

          <?xml version="1.0" encoding="UTF-8" ?>
          <project name="HelloWorld" default="run" basedir="." >
          <property name="src" value="src"/>
          <property name="dest" value="classes"/>
          <property name="hello_jar" value="hello.jar" />
          <target name="init">
          <mkdir dir="${dest}"/>
          </target>
          <target name="compile" depends="init">
          <javac srcdir="${src}" destdir="${dest}"/>
          </target>
          <target name="build" depends="compile">
          <jar jarfile="${hello_jar}" basedir="${dest}"/>
          </target>
          <target name="run" depends="build">
          <java classname="com.sharetop.antdemo.HelloWorld" classpath="${hello_jar}"/>
          </target>
          </project>


          來看一下這個文件的內容,它描述了以下信息:工程的名字為HelloWorld,工程有四個target,分別是init、compil、build和run,缺省是run。compile只有一個任務javac,源文件位于src目錄下,輸出的類文件要放在classes目錄下。build的任務是jar,生成的jar文件為hello.jar,它打包時以classes為根目錄。而run則是執行這個HelloWorld類,用hello.jar作為classpath。這四個target之間有一個依賴關系,這種關系用depends來指定。即如果Target A依賴于Target B,那么在執行Target A之前會首先執行Target B。所以從下面運行缺省Target(run)的輸出看,這四個Target的執行順序是:init→compile→build→run。文件目錄結構如圖1所示。HelloWorld.java文件在src\com\sharetop\antdemo子目錄下。


          圖1 ant_demo應用的目錄結構


          在命令行輸入命令:ant,然后運行,可以看到如下輸出:

          如果配置文件名不是build.xml,比如是build_front.xml,那么,可以使用-buildfile命令參數指定:

          G:\myDoc\ant_demo>ant -buildfile build_front.xml


          也可以單獨執行指定的某個target,比如,只編譯不打包執行,可以使用下面輸入命令即可:

          G:\myDoc\ant_demo>ant compile

          在相應的目錄下會找到編譯出的HelloWorld.class文件。

          再看看上面的build.xml配置文件,文件開頭定義了3個屬性,分別指定了源文件輸出路徑、類文件輸出路徑和生成的Jar文件名,后面對這些路徑的引用都通過一個${property name}來引用。所以,要注意這樣一個原則“目錄的定義與目錄的引用應該分開”。
           

          Ant教程(二)

          基本應用

          建立工程的目錄

          一般要根據工程的實際情況來建立工程的目錄結構。但是,有一些比較通用的組織形式可供參考,比如所有的jakarta項目都使用類似的目錄結構。下面讓我們來看一下這種目錄結構的特點。

          表1

          目錄 文件
          bin 公共的二進制文件,以及運行腳本
          build 臨時創建的文件,如類文件等
          dist 目標輸出文件,如生成Jar文件等。
          doc/javadocs 文檔。
          lib 需要導出的Java包
          src 源文件

          對于一個簡單的工程,一般包括表1的幾個目錄。其中bin、lib、doc和src目錄需要在CVS的控制之下。當然在這樣的目錄結構上,也可以做一些調整,例如,可以建立一個extra目錄來放置需要發布的Jar文件、Inf文件及圖像文件等。同樣,如果開發Web應用可以建立一個Web目錄放置JSP、HTML等文件。

          如果我們開發的是一個比較復雜的項目,包括多個子項目,并且各個子項目是由不同的開發人員來完成的,那么要如何來設計它的目錄結構?首先有一點是需要確定的,不同的子項目應該擁有不同的Build文件,并且整個項目也應該有一個總的Build文件。可以通過Ant任務或是AntCall任務調用子項目的Build文件,如下例:

          <target name="core" depends="init">
          <ant dir="components" target="core"/>
          <ant dir="waf/src" target="core"/>
          <ant dir="apps" target="core"/>
          </target>


          在各個子項目的耦合不是非常緊密的情況下,各個子項目應該有各自獨立的目錄結構,也就是說它們可以有自己的src、doc、build、dist等目錄及自己的build.xml文件,但是可以共享lib和bin目錄。而對于那些耦合緊密的子項目,則推薦使用同一個src目錄,但是不同的子項目有不同的子目錄,各個子項目的build.xml文件可以放在根目錄下,也可以移到各個子項目的目錄下。

          編寫Build文件

          要用好Ant工具,關鍵是要編寫一個build.xml文件。要編寫出一個結構良好、靈活可擴展的Build文件,有兩個問題要考慮,一是了解Build文件的基本結構,二是了解Ant定義的大量任務。

          Ant的Build文件是一個標準的XML文件,它包含一個根節點Project,每個Project定義了至少一個或多個Target,每個Target又是一系列Task的集合。它們之間的關系如圖2所示。


          圖2 build.xml文件的結構


          每個Task是一段可被執行的代碼,比如,前例中的javac、jar就是兩個最常用的Task。Ant定義了大量的核心Task,我們要考慮的第二個問題正是如何去掌握這大量的Task。其實唯一的方法就是邊學習邊實踐,這方面最好的參考就是官方的Ant使用手冊。

          外部文件的使用

          使用外部的Property文件可以保存一些預設置的公共屬性變量。這些屬性可以在多個不同的Build文件中使用。

          可以將一個外部的XML文件導入Build文件中,這樣多個項目的開發者可以通過引用來共享一些代碼,同樣,這也有助于Build文件的重用,示例代碼如下所示:

          <!DOCTYPE project [
          <!ENTITY share-variable SYSTEM "file:../share-variable.xml">
          <!ENTITY build-share SYSTEM "file:../build-share.xml">
          ]>
          <project name="main" default="complie" basedir=".">
          &share-variable;
          &build-share;
          ... ...


          在J2EE項目中的應用

          只要掌握了Ant的使用方法,在J2EE項目中的應用與在其它項目中的應用并沒有太大的不同,但是仍有幾點是需要注意的。

          一是要清楚War和Jar文件的目錄結構,主要是War的配置文件web.xml文件的位置和EJB的配置文件(ejb-jar.xml和weblogic-ejb-jar.xml等)的位置,在調用Jar任務打包文件時一定要記得把它們也包含進來。一般在編譯之前就要注意把這些需打包的文件拷入相應目錄下。二是在J2EE項目中可能會涉及到一些特殊的任務,比如在Weblogic中會調用ejbc預編譯EJB的代碼存根,或者需要在Ant中同時發布Jar到相應的服務器中等。可以用兩種途徑實現這些任務,一是擴展Ant任務實現這些任務,二是直接用Java任務來執行這些命令。下面是打包、發布一個EJB的build.xml配置文件片斷,代碼如下:

          <target name="deploy_HelloEJB" depends="compile">
          <delete dir="${temp}/ejb_make"/> <!-- 首先刪除臨時目錄 -->
          <delete file="${temp}/helloEJB.jar"/>
          <!-- 刪除WebLogic域中老版本的EJB -->
          <delete file="${weblogic.deploy.dest}/helloEJB.jar"/>
          <!-- 創建META-INF目錄,放置ejb-jar.xml和weblogic-ejb-jar.xml -->
          <mkdir dir="${temp}/ejb_make/META-INF"/>
          <!-- 拷貝ejb-jar.xml和weblogic-ejb-jar.xml 到臨時目錄-->
          <copy todir="${temp}/ejb_make/META-INF">
          <fileset dir="etc/baseinfo">
          <include name="*.xml"/>
          </fileset>
          </copy>
          <!-- 拷貝所有的helloEJB類到臨時目錄 -->
          <copy todir="${temp}/ejb_make/">
          <fileset dir="${dest.classes}/"> <!-- dest.classes是輸出的類文件目錄 -->
          <include name="${dest.classes}/helloEJB/**"/>
          </fileset>
          </copy>
          <!-- 將所有這些文件打包成helloEJB.jar -->
          <jar jarfile="${temp}/helloEJB.jar" basedir="${temp}/ejb_make"/>
          <!-- 進行weblogic.ejbc編譯 -->
          <java classpath="${wl_cp}" classname="weblogic.ejbc" fork="yes" >
          <classpath>
          <fileset dir="lib">
          <include name="*.jar" />
          </fileset>
          </classpath>
          <arg value="${temp}/helloEJB.jar" />
          <arg value="${temp}/helloEJB_deploy.jar" />
          </java>
          <!-- 拷貝/發布到WebLogic的{DOMAIN}\applications目錄 -->
          <copy file="${temp}/helloEJB_deploy.jar" todir="${weblogic.deploy.dest}"/>
          </target>


          用Ant配合JUnit實現單元測試

          Ant 提供了JUnit任務,可以執行單元測試代碼。如何使用JUnit,以及如何編寫測試用例(TestCase),感興趣的讀者可以參閱JUnit的相關文檔。在Ant中使用JUnit的方法非常簡單,首先需要把junit.jar拷入ANT_HOME\lib下,確認在這個目錄下有optional.jar,因為JUnit是Ant的擴展任務,需要引用這個擴展包。然后就是在Build文件中加入JUnit的任務,代碼如下:

          <target name="run" depends="client">
          <junit printsummary="yes" fork="yes" haltonfailure="yes">
          <classpath>
          <pathelement location="client.jar" />
          </classpath>
          <formatter type="plain" />
          <test name="com.sharetop.antdemo.HelloWorldTest" />
          </junit>
          </target>


          高級話題

          為Ant開發擴展任務

          為Ant實現擴展任務其實是非常容易的,只需按照以下幾個步驟即可:

          1. 創建一個Java類繼承org.apache.tools.ant.Task類;

          2. 對每個屬性實現set方法。Ant會根據需要自動完成類型轉換;

          3. 如果擴展的任務需要嵌套其它的Task,那么這個Java類必需實現接口org.apache.tools.ant.TaskContainer;

          4. 如果擴展的任務要支持Text,需要增加一個方法void addText(String);

          5. 對每個嵌套的元素,實現create、add 或 addConfigured 方法;

          6. 實現public void execute方法;

          7. 在build.xml文件中使用 <taskdef> 來引用自定義的Task。

          下面以一個簡單的例子來說明如何為Ant增加一個hello任務,它可以連續打印多條信息,打印的次數由屬性count指定,而打印的內容則由它內嵌的一個helloinfo任務的message屬性指定,看上去這非常類似JSP中自定義標簽的一些概念,實現代碼如下:

          //HelloInfoTask.java
          package com.sharetop.antdemo;
          import org.apache.tools.ant.*;
          public class HelloInfoTask {
          private String msg;
          public void execute() throws BuildException {
          System.out.println(msg);
          }
          public void setMessage(String msg) {
          this.msg = msg;
          }
          }


          下面是外部Task類的代碼:

          //HelloTask.java
          package com.sharetop.antdemo;
          import org.apache.tools.ant.*;
          public class HelloTask extends Task implements org.apache.tools.ant.TaskContainer
          {
          private Task info;
          private int count;
          public void execute() throws BuildException {
          for(int i=0;i<count;i++)
          info.execute();
          }
          public void setCount(int c){
          this.count=c;
          }
          public void addTask(Task t){
          this.info=t;
          }
          }


          實現了這兩個Task,在build.xml文件中定義它的task name,就可以在Target中執行它了。如果你不想使用 <taskdef> 標簽來定義Task,也可以通過修改default.properties文件來實現引入新Task,這個文件位于org.apache.tools.ant.taskdefs 包里。下例是一個使用 標簽來引入新Task的Build文件部分:

          <target name="hello" depends="client">
          <taskdef name="hello"
          classname="com.sharetop.antdemo.HelloTask" classpath="client.jar"/>
          <taskdef name="helloinfo"
          classname="com.sharetop.antdemo.HelloInfoTask" classpath="client.jar"/>
          <hello count="3" >
          <helloinfo message="hello world" />
          </hello>
          </target>
          posted on 2007-06-19 11:43 麟楓 閱讀(560) 評論(2)  編輯  收藏 所屬分類: 資料

          Feedback

          # re: Ant教程 2007-07-17 17:47 cylix
          替換文件中的標記

          我們將在本節考察的最后一個文件系統操作是 replace 任務,它執行文件中的查找和替換操作。
          token 屬性指定要查找的字符串,value 屬性指定一個新的字符串,查找到的標記字符串的所有實
          例都被替換為這個新的字符串。例如:
          <replace file="input.txt" token="old" value="new"/>
          替換操作將在文件本身之內的適當位置進行。為了提供更詳細的輸出,可把 summary 屬性設置為
          true。這將導致該任務輸出找到和替換的標記字符串實例的數目。  回復  更多評論
            

          # re: Ant教程 2007-07-28 11:40 cylix
          Ant 命令行參考
          從命令行調用Ant 的語法如下所示:
          ant [option [option...]] [target [target...]]
          option := {-help
          |-projecthelp
          |-version
          |-quiet
          |-verbose
          |-debug
          |-emacs
          |-logfile filename
          |-logger classname
          |-listener classname
          |-buildfile filename
          |-Dproperty=value
          |-find filename}
          語法元素說明如下:
          -help
          顯示描述Ant 命令及其選項的幫助信息。
          -projecthelp
          顯示包含在構建文件中的、所有用戶編寫的幫助文檔。即為各個<target>
          中description 屬性的文本,以及包含在<description>元素中的任何文
          本。將有description 屬性的目標列為主目標(“Main target”),沒有此屬
          性的目標則列為子目標(“Subtarget”)。
          -version
          要求Ant 顯示其版本信息,然后退出。
          -quiet
          抑制并非由構建文件中的echo 任務所產生的大多數消息。
          -verbose
          顯示構建過程中每個操作的詳細消息。此選項與-debug 選項只能選其一。
          -debug
          顯示Ant 和任務開發人員已經標志為調試消息的消息。此選項與-verbose 只
          能選其一。
          -emacs
          對日志消息進行格式化,使它們能夠很容易地由Emacs 的shell 模式(shellmode)
          所解析;也就是說,打印任務事件,但并不縮排,在其之前也沒有
          [taskname]。
          -logfile filename
          將日志輸出重定向到指定文件。
          -logger classname
          指定一個類來處理Ant 的日志記錄。所指定的類必須實現了org.apache.
          tools.ant.BuildLogger 接口。
          -listener classname
          為Ant 聲明一個監聽類,并增加到其監聽者列表中。在Ant與IDE或其他Java
          程序集成時,此選項非常有用。可以閱讀第六章以了解有關監聽者的更多信
          息。必須將所指定的監聽類編寫為可以處理Ant 的構建消息接發。
          -buildfile filename
          指定Ant 需要處理的構建文件。默認的構建文件為build.xml。
          -Dproperty=value
          在命令行上定義一個特性名-值對。
          -find filename
          指定Ant 應當處理的構建文件。與-buildfile 選項不同,如果所指定文件在當
          前目錄中未找到,-find 就要求Ant 在其父目錄中再進行搜索。這種搜索會繼
          續在其祖先目錄中進行,直至達到文件系統的根為止,在此如果文件還未找
          到,則構建失敗。
          構建文件輪廓
          下面是一個通用的構建文件,它很適合作為一個模板。構建文件包括<project>
          元素,以及其中嵌套的<target>、<property> 和<path> 元素。
          <project default="all">
          <property name="a.property" value="a value"/>
          <property name="b.property" value="b value"/>
          <path id="a.path">
          <pathelement location="${java.home}/jre/lib/rt.jar"/>
          </path>
          <target name="all">
          <javac srcdir=".">
          <classpath refid="a.path"/>
          </javac>
          </target>
          </project>

          關于構建文件有幾點需要記住:
          ● 所有構建文件都要有<project>元素,而且至少有一個<target> 元素。
          ● 對于<project> 元素的default 屬性并沒有默認值。
          ● 構建文件并不一定要被命名為build.xml。不過build.xml 是Ant 要搜索的默
          認文件名。
          ● 每個構建文件只能有一個<project> 元素。  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 湟中县| 加查县| 淳安县| 墨玉县| 延长县| 保山市| 柯坪县| 溧阳市| 政和县| 通州市| 昌邑市| 长宁区| 建湖县| 康平县| 鹿泉市| 天峻县| 通江县| 新郑市| 建瓯市| 阿克| 彭州市| 湘阴县| 武川县| 积石山| 临洮县| 城口县| 大同市| 富宁县| 乾安县| 江安县| 页游| 咸丰县| 南宫市| 平江县| 苗栗县| 绍兴县| 和平县| 兴文县| 虞城县| 观塘区| 读书|