ANT簡明教程[轉載]

賀滿發表於2014-04-06

一、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專案了。

相關文章