使用Ant,第1部分:將Ant腳本引入Java項目


核心概念,簡單任務,項目集成和異常處理

簡介


Apache Ant是一種基於Java 語言的構建工具,它已經出現了好幾年了,並且現在已經成為了實際意義上的構建 Java 項目的標准了。Ant 是用 Java 語言編寫的,並且具有良好的擴展性,允許用戶在它的特性上進行軟件的構建並可以容易的與其他的工具和系統以各種方式進行有效的集成。語言編寫的,並且具有良好的擴展性,允許用戶在它的特性上進行軟件的構建並可以容易的與其他的工具和系統以各種方式進行有效的集成。因為 Ant 最初是為構建 Java 應用而設計的,因此它能夠理解 Java 的領域,並知道如何使用它。因為 Java 平台, Ant 也是跨平台的,這就意味這你在一個平台上創建的構建文件可以在不作任何改動的情況下運行在其他支持 Java 的平台上。

基礎知識


在深入研究有趣的Ant內容之前,我們先了解一些基礎知識,如何安裝Ant,以及如何使其正常運行。首先從 Apache Ant 官網下載 (http://ant.apache.org/bindownload.cgi) ,然后解壓文件,放到指定的系統目錄中,其次設定好相應的環境變量 (可以參考官網Installing Ant  http://ant.apache.org/manual/index.html 相關介紹),最后添加需要的可選庫。這里需要了解的是一些IDE,例如Eclipse可以不需要設置Path,而是通過IDE相關設置將Ant添加到Path中。

Windows安裝過程(以筆者的安裝過程為例)

下載apache-ant-1.8.4-bin.zip到本地硬盤,解壓之后將文件夾放到C: 根目錄下(c:/apache-ant-1.8.4),這個目錄就是Ant的主目錄。將主目錄中的bin (c:/apache-ant-1.8.4/bin)目錄添加到Path屬性中,這樣就可以在命令行中調用ant命令,ANT_HOME是批處理文件所在目錄的上級目錄,我就設定為c:/apache-ant-1.8.4。現在許多工具已經集成了特定版本的Ant,一些操作系統甚至默認的已經安裝了Ant。所以,你的系統中可能已經安裝了Ant。

可以通過ant -version 和 ant –diagnostics 來確定是否安裝成功。注意:不推薦你設置CLASSPATH來運行Ant命令。如果任何版本的Ant可以從CLASSPATH加載 ,這時就會由於加載了不兼容的類而產生許多錯誤。

Ant核心概念

  1. XML:所有的 Ant 構建都是被一個 XML 格式的構建文件 (等價於一個 "Makefile" 文件) 驅動的。缺省的情況下,這個文件叫作 build.xml,並放在項目的根目錄下。然而,你也可以在項目中包含任意命名的一系列的構建文件。 Ant 允許你調用或者將這些文件串在一起,比如,你想要遞歸的構建一個包含多個項目的目錄結構。
  2. 陳述式語法:構建文件短小精悍,且易於理解。構建文件總是引用一個單一的項目,例如一個應用。項目有一系列能夠被調用的目標(targets)。這些目標是構建過程的核心部分(比如,編譯、測試、產生分發文件和部署)。每一個目標被順序的調用。
  3. 工程(project):每個構建文件包含一個工程(project)
  4. 目標(target):每一個工程包含若干個目標(target)
  5. 依賴(depends):目標可以依賴(depends)於其它的目標
  6. 任務(task):目標包含任務(task)

Ant 一個典型的示例

下面是一個典型的部署項目的例子,學習這個例子之前先弄清楚一個概念,構建文件的概念視圖:工程包含一個目標的集合,在每個目標里面是任務的聲明,他們是對Ant用於構建該目標行為的說明,目標生成一個依賴關系圖表來聲明該目標的依賴關系,當執行一個目標時,必須先執行它們依賴的目標。

圖1. Ant構建文件的概念視圖示例

清單1. 一個典型的構建文件

<xml version="1.0" ?>
<project name="DemoProject" default="deploy">
  <property name="dir.src" value="src"/>
  <property name="dir.build" value="build"/>
  <property name="dir.dist" value="dist"/>

  <target name="init">
    <mkdir dir="${dir.build}" />
    <mkdir dir="${dir.dist}" />
  </target>

  <target name="compile" depends="init" >
    <javac srcdir="${dir.src}" destdir="${dir.build}"/>
  </target>

  <target name="doc" depends="init" >
    <javadoc destdir="${dir.build}" sourcepath="${dir.src}" packagenames="org.*" />
  </target>
  
  <target name="deploy" depends="compile,doc" >
    <jar destfile="${dir.dist}/project.jar" basedir="${dir.build}"/>
    <ftp server="" userid="" password="">
      <fileset dir="${dir.dist}"/>
    </ftp>
  </target>
</project>

該示例的構建過程如下:

0. 初始化 1. 編譯 2. 生成JavaDoc 3.打包 4.上傳到FTP (其中第3、4步結合到一起叫部署) 。

注意:

  1. Ant的簡單任務(<mkdir>)都是由Java類庫來實現相應的功能的。而一些復雜的任務<ftp>,<junit>還需要第三方庫的支持。
  2. 在執行Ant構建腳本時,你可以使用命令行傳入一個.properties屬性文件(或者在Ant腳本中直接引入),屬性文件中可以定義任務運行時需要的參數。
  3. Ant的一個強大之處在於它總能工作。只要正確的指定構建文件,Ant就能計算出目標的依賴性,並且按照正確的順序調用目標。目標通過任務按序執行,而任務自身處理其文件依賴性以及實際的操作來完成工作。因為每個任務通常都是在高層陳述,所以一兩行XML語句經常就已經足夠描述任務的內容。

Ant - Java項目集成


1. 創建一個Java工程,名為DemoProject,工程中源文件和目標文件是分開的,分別為文件夾src和bin,然后創建一個Java類文件,類名為AntDemoTest.java

  清單2. AntDemoTest 源代碼

package com.test;

public class AntDemoTest {
  public static void main(String[] args) {
    for (int i = 0; i < args.length; i++) {
      System.out.println(args[i]);
    }
  }
}

2. 在工程的根路徑下創建一個構建文件build.xml

  清單 3. build.xml 文件內容

<?xml version="1.0" encoding="UTF-8"?>
<project name="DemoProject" default="archive">
  <property name="dir.src" value="src"/>
  <property name="dir.build" value="build"/>
  <property name="dir.build.classes" value="build/classes"/>
  <property name="dir.dist" value="dist"/>
  
  <target name="init">
    <mkdir dir="${dir.build.classes}" />
    <mkdir dir="${dir.dist}" />
  </target>
  
  <target name="compile" depends="init" >
    <javac srcdir="${dir.src}" destdir="${dir.build.classes}"/>
  </target>
  
  <target name="archive" depends="compile" >
    <jar destfile="${dir.dist}/project.jar" basedir="${dir.build.classes}" />
  </target>
  
  <target name="clean" depends="init">
    <delete dir="${dir.build}" />
    <delete dir="${dir.dist}" />
  </target>
</project>

目標init 包含兩個任務<mkdir>,用於創建輸出文件夾;目標compile包含一個任務<javac>,用於編譯源文件並將編譯后的文件放置到輸出文件夾里面;目標archive包含一個任務<jar>,用於打包;目標clean包含兩個任務<clean>,用於刪除輸出文件夾。這里目標compile和clean都是依賴於目標init的,而目標archive則是依賴於compile的。

3. 在命令行運行ant腳本

  圖2:命令行運行ant腳本

注意:此處 ant 等價於 ant archive,因為在構建文件中,我們定義了default="archive"

4. 查看 DemoProject文件夾,你會發現多出了build以及dist文件夾,如此你已經成功的運行了Ant腳本。

進一步拓展


構建失敗了怎么辦?

首先有可能是XML語法書寫不正確(將<target>寫成<targe>),或者在任務執行過程中出現了錯誤(.java文件中包含編譯錯誤),或者任務名稱書寫錯誤(將<javac>寫成<javacc>)等等。寫XML時一定要細心,一些IDE已經有驗證功能,可以很好的防止書寫的錯誤。一旦出現錯誤了,可以使用 ant –verbose 或者 ant –debug 來獲取更加詳細的構建信息,以解決問題。

圖3:命令行運行ant -debug

Ant當構建完成一次以后,再次執行構建會發生什么?

圖4:連續構建效果

實際上第二次運行構建時,目標都沒有進行任何工作。由於所有的任務都檢查了它們的依賴關系:<mkdir>沒有創建目錄因為已經存在;<javac>比較了源文件和類文件的時間戳;<jar>比較了要被加入文件與已經存在文件的時間。只有更新的時候才進行任務執行。

Ant是如何處理命令行上的多個目標?

圖5:Ant 處理命令行上多個目標

Ant依次執行每個目標和其依賴目標,即Ant的執行順序是init compile init compile archive,雖然這樣看起來增加了額外的工作,但是通過上面的執行過程就會發現,由於其依賴性檢查的阻止,第二次的init和compile並未真正的執行,執行時間與直接執行archive的時間是一樣的。

Ant 是如何運行程序的?

要運行上面編譯出來的文件,不但可以在命令行里面直接使用java命令,也可以在構建文件build.xml中添加一個task來運行。

清單 4. 在build.xml 文件中添加程序運行目標

<target name="execute" depends="compile">
    <java classname="com.test.AntDemoTest" classpath="${dir.build.classes}">
      <arg value="hello"/>
      <arg value="world"/>
      <arg file="."/>
    </java>
  </target>

注意:最后一個參數是file=”.”,表示傳入的參數是一個目錄,為文件絕對路徑。

圖6:Ant執行execute目標

Ant 一些常用的命令行

圖7:Ant命令行選項

當有多個構建文件時,指定構建文件:

  ant –buildfile build.xml compile

控制提示信息量:

  ant –quite (安靜模式,沒有任何輸出)

  ant –emaces (簡單模式,不顯示任務名稱)

獲取項目信息

  ant -projecthelp

編寫Ant腳本時可以使用到的格式

<?xml version="1.0" encoding="UTF-8"?>
<project name="vmness-acrm" default="help">

  <property name="dir.src" value="src"/>
  <property name="dir.build" value="build"/>
  <property name="dir.build.classes" value="${dir.build}/classes"/>
  <property name="dir.dist" value="dist"/>
  <!-- 加載project.properties文件-->
  <loadproperties srcFile="project.properties" />
  <!-- 加載./build文件目錄下的build.xml構建文件-->
  <import file="./build/build.xml" />

  <target name="help">
    <!-- displays starts at col 13
          |13                                                           80| -->
    <echo>VMNess ACRM Ant Build. Available targets:</echo>
    <echo>   help:      Displays this help.</echo>
    <echo>   clean:     Removes output files created by other targets.</echo>
    <echo>              The 'all' target can be used to clean dependencies</echo>
    <echo>              (tested projects and libraries)at the same time</echo>
    <echo>              using: 'ant all clean'</echo>
  </target>
</project>

可以參考Android內置的build.xml

結束語


這篇教程已經介紹了Ant的入門級知識。你已經看到如何在Java 項目中集成Ant以及Ant的邊邊角角,后面兩個教程將陸續介紹Ant使用的中級和高級教程。

作者QQ:1321518080


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM