【ANT】Ant簡明教程

走在路上的WWB發表於2012-02-09
【轉載】Ant簡明教程

一、Ant介紹

  Ant是構建工具,用來實現軟體的自動化的構建,類似於VisualStudio的project檔案,Linux上構建C++的makefile,Ant通常用來構建Java程式。Ant是基於XML的檔案,所以更容易閱讀;Ant是用Java實現的,本身支援跨平臺;Ant基於外掛的方式開發,本身內建了常用的大部分的外掛,而且第三方的擴充套件也很容易;Ant除了用來構建Java程式,也可以用來構建其他的任何程式,例如C++等。
  

二、Ant的配置

1)安裝JDK,設定JAVA_HOME和classpath、path。

2)下載安裝Ant,且設定ANT_HOME和path。

3) 最後驗證是否安裝成功在命令列視窗中輸入ant,如果顯示

Buildfile: build.xml does not exist!

Build failed

則安裝成功。

三、Ant的基礎元素

1. Project元素

  Project元素是Ant檔案的根元素,Ant構建檔案中至少應該包含一個project元素,否則會發生錯誤。在每個project元素下面可以包含多個target元素。project的屬性包括:

name : 指定專案名稱,該屬性僅指定一個名字,對編譯、生成專案沒有太大的實際作用。

default:指定預設的target,這個屬性是必需的。當執行ant命令沒有顯式指定target時,ant將執行此project的預設targe。

basedir:用於指定專案的基準路徑,屬性沒有指定時,使用Ant的構建檔案的父目錄作為基路徑。

description:指定專案的描述資訊,對編譯、生成專案沒有太大的實際作用。

例如:

< ?xml version="1.0" ?>
< project name ="antPro" default ="getBaseDir" basedir =".">
    <target name="getBaseDir">
        <echo message="The base dir is: ${basedir}"/>
    </target>
< /project>

  在這裡定義了default 屬性的值為getBaseDir ,即當執行ant 命令時,如果沒有指定待執行的target,則將執行預設的target--getBaseDir 。

2)target元素

target為Ant的基本執行單元,他可以包含一個或多個具體的任務。

target的屬性有:

name: target的名稱,這個屬性在一個project中是唯一的。我們可以通過指定 target 元素的名稱來指定某個 target 。

depends:用來描述target間的依賴關係,若與多個 target 存在依賴關係時,需要以“,”間隔。 Ant 會依照 depends 屬性中 target 出現的順序依次執行每個 target 。被依賴的 target 會先執行。

if:用於驗證指定的屬性是否存在,若不存在,所在 target 將不會被執行。

unless:該屬性的功能與 if 屬性的功能正好相反,它也用於驗證指定的屬性是否存在,若不存在,所在 target 將會被執行。

description:該屬性是關於 target 功能的簡短描述和說明。


多個target可以存在相互依賴的關係。Ant會依照depends屬性中target出現的順序依次執行每個target。然而,要記住的是隻要某個target依賴於一個target,後者就會被先執行。

<target name="A"/>

<target name="B" depends="A"/>

<target name="C" depends="B"/>

<target name="D" depends="C,B,A"/>

假定我們要執行target D。從它的依賴屬性來看,你可能認為先執行C,然後B,最後A被執行。錯了,C依賴於B,B依賴於A,所以先執行A,然後B,然後C,最後D被執行。一個target只能被執行一次,即時有多個target依賴於它。

3)property元素

property元素用於定義一個或多個屬性,可看作程式語言中的變數或者引數的定義,project 的屬性可以通過 property 元素來設定,也可在 Ant 之外設定。例如<property name ="name" value ="philander"/>。若要在外部引入某檔案,例如 build.properties 檔案,可以通過如下內容將其引入<property file=” build.properties”/>。

舉例說明如下:
<? 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} 分別取得這兩個屬性值。

下面給出幾個使用property元素的例子:

<!-- 指定讀取foo.propertyies屬性檔案中的屬性名和屬性值 -->
<property file="foo.properties"/>

<!-- 指定從指定URL處讀取屬性名和屬性值 -->
<property url="http://www.tjsinfo.com/ant/foo.properties"/>

<!-- foo.propertyies屬性檔案內容舉例
author=LiYang
book=Java
price=18
-->

<!-- 定義訪問作業系統環境變數的字首是env -->
<property environment="env"/>
<!-- 輸出JAVA_HOME的環境變數 -->
<echo>${env.JAVA_HOME}</echo>

四、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 檔案,在該檔案中編譯src 目錄下的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>

  在專案根目錄執行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


六、使用war命令打包JavaEE專案

  建立一個JavaEE專案,其中src 為Java原始碼目錄,WebContent為各jsp存放目錄,lib 為專案引用的的包的目錄。在WebTest專案目錄下建立了build.xml 檔案,該檔案為該工程的 Ant 構件檔案。

|WebContent

  |src

  |build

    |classes

  |WebContent

    |META-INF

    |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>

  執行ant後,就生成了WebTest.war 檔案了,然後可以將其放入Web容器(如Tomcat)的相應目錄下(${Tomcata安裝目錄}\webapps)執行該web專案了。

分類: Ant