一. 配置環境變量
1. 添加ANT_HOME——Ant目錄;(可選)
2. 在PATH追加"Ant目錄\bin"
3.在控制檯cmd輸入命令ant,提示
“Buildfile: build.xml does not exist!
Build failed“
表示系統能夠識別ant 命令了,這樣可以在任意文件夾下運行該命令。
二. build.xml文件的組成
build.xml文件的主幹是,一個根結點project,project裏面包含多個target,target內含不同的task。
Ant的大概運行過程
當運行ant命令,則嘗試讀取當前目錄的build.xml,分析xml文件,按照project的default屬性,執行指定的target。
當運行ant targetname,則在讀取xml文件後,分析找到相應的target並執行。
1.project根結點
基本屬性:name、default、basedir。
name: 項目名稱(可選)
default: 默認開始執行的target。(必需)
basedir: 用於計算所有其他路徑的基路徑。可以被basedir property覆蓋。當覆蓋時,該屬性被忽略。如果屬性和basedir property都沒有設定,就使用build.xml的父目錄。一般basedir=".",設置爲build.xml所在的目錄。(可選)
2.target
Attribute屬性 | Description屬性值內容 | Required |
name | target的名字 | Y |
depends | 需要依賴的其他target | N |
description | 關於target功能的簡短描述 | N |
if | 爲了執行本target而被設置的屬性的名字 | N |
unless | 爲了執行本target而不被設置的屬性的名字 | N |
2.1 依賴關係depands
<target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="B"/>
<target name="D" depends="C,B,A"/>
當執行target D,則先執行A,再B,然後C,最後D。
一個target只能被執行一次,即使有多個target依賴於它。
2.2 if,unless
if屬性表示該屬性內容的變量如果已經被設置了,則可以執行本target;
unless屬性則表示該屬性內容的變量如果還沒有被設置,則可以執行本target。
僞代碼:
//if="ready" //unless="ready"
if(ready == "ok"){ if(ready == null){
execute target; execute target;
}else { }else {
skip; skip;
} }
如果沒有if或unless屬性,target總會被執行。
2.3 description屬性可選的description屬性可用來提供關於target的一行描述,可由-projecthelp命令行選項輸出
3. task
常用的task:
3.1 創建目錄mkdir
創建一個目錄,如果其父目錄不存在,也會被同時創建。
<mkdir dir="build/classes"/>
<target name="init">
<mkdir dir="${dist.dir}" />
<mkdir dir="${dist.classes.dir}" />
<mkdir dir="${dist.webapps.dir}" />
</target>
3.2 刪除目錄delete
<delete includeEmptyDirs="true">
<fileset dir="${build}"/>
</delete>
<target name="clean" description="clean up" >
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
3.3 copy文件或目錄
<copy file="file" tofile="file.bak"/>
<copy file="config.xml" todir="${dist.classes.dir}"/>
<copy todir="${targetdir}">
<fileset dir="${sourcedir}"/>
</copy>
<target name="copy-resources" depends="clean">
<copy todir="${targetdir}">
<fileset dir="${sourcedir}">
<exclude name="**/**/*.java" />
</fileset>
</copy>
</target>
3.4 move文件或目錄
<move file="file" tofile="file.bak"/>
<move todir="${targetdir}">
<fileset dir="${sourcedir}"/>
</move>
<move todir="${targetdir}">
<fileset dir="${sourcedir}">
<include name="**/**/*.java" />
</fileset>
</move>
3.5 compile
<path id="libraries">
<fileset dir="${libdir}">
<include name="*.jar" />
</fileset>
</path>
<target name="compile" depends="copy-resources">
<javac srcdir="${sourcedir}"
destdir="${targetdir}"
classpathref="libraries" />
<jar destfile="${jardir}/my.jar" basedir="${targetdir}"/>
</target>
3.6 jar
<jar destfile="${jardir}/my.jar" basedir="${targetdir}"/>
<jar destfile="${dist}/lib/app.jar">
<fileset dir="${build}/classes"
excludes="**/Test.class"
/>
<fileset dir="${src}/resources"/>
</jar>
4. 變量property
<property name="sourcedir" value="${basedir}/src" />
<property name="build" location="build" />
除了可以使用自定義的變量,還可以使用java系統屬性, 例如${os.name}對應操作系統的名字,以及Ant內置屬性:
basedir <project>的basedir屬性
ant.file buildfile的絕對路徑
ant.version Ant的版本
ant.project.name 當前執行的project的名字;由<project>的name屬性設定
ant.java.version Ant檢測到的JVM的版本
5. build.xml example
<?xml version="1.0" encoding="UTF-8" ?> <project default="junitTest" name="myProject" basedir="."> <property name="sourcedir" value="${basedir}/src" /> <property name="targetdir" value="${basedir}/WEB-INF/classes" /> <property name="libdir" value="${basedir}/WEB-INF/lib" /> <path id="libraries"> <fileset dir="${libdir}"> <include name="*.jar" /> </fileset> </path> <target name="junitTest" depends="compile"> <java classname="junit.textui.TestRunner" > <classpath> <path refid="libraries" /> <path location="${targetdir}" /> </classpath> <arg value="can.junit.HibernateDemoTest" /> </java> </target> <target name="compile" depends="copy-resources"> <javac srcdir="${sourcedir}" destdir="${targetdir}" classpathref="libraries" /> </target> <target name="copy-resources" depends="clean"> <copy todir="${targetdir}"> <fileset dir="${sourcedir}"> <exclude name="**/**/*.java" /> </fileset> </copy> </target> <target name="clean" > <delete dir="${targetdir}" /> <mkdir dir="${targetdir}" /> </target> </project>