ant之build.xml詳解

最近項目中用到了ant構建項目,由於之前一直用的maven,沒接觸過ant,就抽空補了下ant相關知識。下面分三部分介紹ant:

  • ant安裝
  • ant命令
  • build.xml配置詳解

ant安裝

直接上官網下載ant包ant官網,最新包是apache-ant-1.9.4-bin.zip。將其解壓到某個目錄,我的放置在E:\develop目錄下

然後配置環境變量,增加系統變量ANT_HOME,值爲ant的解壓目錄(本機目錄爲E:\develop\apache-ant-1.9.2,修改系統變量Path,追加%ANT_HOME%\bin。

然後打開cmd窗口,輸入命令ant -version。若正常顯示ant版本信息,表示安裝成功。

ant命令

輸入ant -h命令可查看幫助文檔如下:

ant [options] [target [target2 [target3] ...]]
Options:
  -help, -h              print this message
  -projecthelp, -p       print project help information
 ……

選項有很多,下面說明常用的幾個選項。

-projecthelp, -p 打印項目幫助信息
-buildfile <file> 指定buildfile文件名(默認在當前目錄下查找build.xml)
-file      <file> 同上
-f         <file> 同上
-lib <path> 指定類路徑

[target]不指定時,會執行buildfile中的默認target

build.xml配置詳解

build.xml就是一個XML文件,它包含一個project節點和至少一個target節點,target節點包含多個task元素。簡單說,target節點代表着你的構建目標,而該目標是由多個操作/任務(task)來達成的。

文字描述比較枯燥,下面以簡單的java項目爲例,說明如何通過ant發佈jar包。

在eclipse中新建一個java項目,結構如下
項目結構圖
HelloAnt.java內容爲:

package com.tq.ant;

import org.apache.commons.lang.StringUtils;

/**
 * @version 1.0
 * @author tangqian
 */
public class HelloAnt {

    public boolean isBlank(String str){
        return StringUtils.isBlank(str);
    }

    public static void main(String[] args) {
        System.out.println("Hello ant!");
    }

}

其中成員方法isBlank引用到commons-lang-2.5.jar中StringUtils.isBlank()方法。

jdbc.properties包含數據庫連接配置信息如下:

driverClassName=com.mysql.jdbc.Driver
db.mysql.url=jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8
db.mysql.username=root
db.mysql.password=root

該項目通過ant打包發佈,build.xml包含內容如下

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." default="build" name="ant_test">
    <property name="lib" value="E:/workspace/bi_mr_STB/lib" />
    <path id="ant_test.classpath">
        <pathelement location="bin" />
        <pathelement location="${lib}/commons-lang-2.5.jar" />
    </path>
    <target name="init">
        <mkdir dir="bin" />
        <copy includeemptydirs="false" todir="bin">
            <fileset dir="src">
                <exclude name="**/*.java" />
            </fileset>
        </copy>
    </target>
    <target depends="init" name="build">
        <echo message="${ant.project.name}: ${ant.file}" file="www.txt" />
        <javac destdir="bin" debug="true" includeantruntime="false">
            <src path="src" />
            <classpath refid="ant_test.classpath" />
        </javac>
    </target>
    <target depends="build" name="dist">
        <jar destfile="hello-ant.jar" basedir="bin">
            <manifest>
                <attribute name="Main-Class" value="com.tq.ant.HelloAnt" />
            </manifest>
        </jar>
    </target>
    <target name="clean">
        <delete dir="bin" />
        <delete file="hello-ant.jar" />
    </target>
</project>

下面詳解各節點及屬性含義:

project

根節點,代表一個工程
屬性說明:
name 表示工程名稱
basedir 表示基準目錄(值爲”.”代表當前目錄,即build.xml所在目錄,也可採用絕對路徑)
default 表示默認運行的target(當ant命令沒有指定target時,會運行default屬性中的target)

target

目標節點,代表着一個構建目標
屬性說明:
name 表示目標名稱
depends 表示依賴的target。像上例中,dist依賴build,build依賴init,也就是說,當ant運行dist這個target時,會根據依賴關係先運行build,build又會先運行init,各個target的執行次序是init->build->dist。即邏輯上的先執行初始化操作,然後進行源代碼編譯,最後將class文件打成jar包的過程。

property

設置一個或多個屬性(可以在其它地方通過${屬性名}進行引用)
屬性說明:
name 表示屬性名(區分大小寫)
value 表示屬性值
file 表示要加載的屬性文件路徑(該文件可包含多個屬性,類似jdbc.properties的內容)

下面接着說明各個target中tasks含義

mkdir

創建目錄
屬性說明:
dir 表示要創建目錄

delete

刪除目錄或文件
屬性說明:
dir 表示要刪除的目錄,該目錄下的文件和子目錄都會被刪除
file 表示要刪除的文件

echo

向屏幕或文件輸出信息
屬性說明:
message 表示要輸出的信息
file    表示信息輸出到該文件中(如果指定了該屬性,信息將不會在屏幕上顯示)
level   表示信息級別(未指定該屬性時的默認級別爲"warning"

copy

拷貝文件或目錄
屬性說明:
todir            表示拷貝到哪個目錄下
includeemptydirs 是否拷貝空目錄
file             要拷貝的單個文件(只針對單個文件的拷貝,上例中沒有指定該屬性,而是通過內嵌<fileset>來指定多個文件)

javac

編譯源文件
屬性說明:
srcdir    源文件路徑(多個源之間用:分隔,可通過內嵌<src>元素進行設定,如上例)
destdir   存放編譯後的class文件路徑
includes  包含的文件列表(多個列表用逗號或空格分隔,列表可用通配符指定)。該屬性省略時,所有的.java文件被包含進去
excludes  排除的文件列表(多個列表用逗號或空格分隔,列表可用通配符指定)。
debug     編譯時是否顯示調試信息
includeantruntime 是否包含ant庫路徑
classpath 依賴庫路徑(上例中通過內嵌<classpath>元素進行了設定)

jar

class文件打成jar
屬性說明:
destfile  將創建的jar包位置
basedir   將被打成jar包的目錄(或通過內嵌的<fileset>元素進行設定)
includes  包含的文件列表(多個列表用逗號或空格分隔,列表可用通配符指定)。該屬性省略時,所有的文件被包含進去
excludes  排除的文件列表(多個列表用逗號或空格分隔,列表可用通配符指定)。
可內嵌<manifest>元素,通過設定Main-Class屬性來設定jar包的入口類(如上例)

Resource Collections

ant中經常需要指定資源集合,主要通過下面元素指定
fileset

屬性說明:
dir    文件集合的根目錄(該目錄下的文件都會被包含)
file   快捷指定單個文件
includes  包含的文件列表(多個列表用逗號或空格分隔,列表可用通配符指定)。該屬性省略時,所有的文件被包含進去
excludes  排除的文件列表(多個列表用逗號或空格分隔,列表可用通配符指定)。
casesensitive 指定包含或排除模式匹配時是否區分大小寫,默認區分
可內嵌<include><exclude><patternset><filename>等元素

patternset

模式集合
屬性說明:
id 唯一標識(其它<patternset>元素通過refid指向該模式)
可內嵌<include><exclude><includesfile><excludesfile>等元素

include
exclude

指定單個模式(包含或排除)
屬性說明:
name 要包含或排除的模式

includesfile
excludesfile

指定模式文件
屬性說明:
name 模式文件名(文件內容爲包含或排除模式)

Path-like Structures

在通過ant運行java類,或執行編譯時,都需要指定classpath,可通過下面三個元素來指定引用的jar包或class文件

classpath

類路徑,內嵌在<javac>,<java>等元素中,表示依賴庫路徑
屬性說明:
refid    指向該id對應的元素
location 單個文件或目錄(目錄可以是相對路徑或絕對路徑,相對路徑是指相對於工程的基準路徑)
path     多個location的集合(各location以冒號或分號進行分隔),一般用來引用預定義的路徑,如引用環境變量${classpath}
其它說明:
可內嵌<fileset><pathelement>等元素來指定jar文件或目錄

path

類路徑集合,被<classpath>或其它<path>引用。
path用法類似<classpath>元素,但是<path><target>同級,而classpath是內嵌在<java><javac>元素中。

pathelement

單個類路徑,內嵌在<classpath><path>中
屬性說明
location 單個文件或目錄(目錄可以是相對路徑或絕對路徑,相對路徑是指相對於工程的基準路徑)
path     多個location的集合(各location以冒號或分號進行分隔),一般用來引用預定義的路徑,如引用環境變量${classpath}
發佈了59 篇原創文章 · 獲贊 62 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章