最近項目中用到了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&useUnicode=true&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}