Ant學習筆記(1) 基礎知識

Anthtml

Apache Ant 是一個基於 Java的構建工具。java

 

下載Antweb

google、baidu。Windows用戶下載zip格式。解壓便可。apache

wps_clip_image-18672

 

 

 

Windows安裝Antapi

Ant本質上是一個Java程序且應用於Java代碼的編譯,所以爲了使用Ant,系統須要好配置JDK。服務器

所謂的安裝Ant,即配置環境變量。app

  1. 添加ANT_HOME變量,變量值爲Ant的路徑。該路徑指的是包含bin,lib的文件夾。
  2. 配置PAHT變量,將【%ANT_HOME%\bin;】添加至環境變量PATH中。能夠不配,配置PATH只是爲了方便在命令行環境下使用。

wps_clip_image-1902wps_clip_image-14903

注意:Win7下安裝時,若ANT_HOME配置在用戶變量中,須要以管理員身份打開cmd才能夠正常使用。因此,能夠把ANT_HOME配置在系統變量中就行了。less

經過以上步驟後,在命令行下輸入ant -version,即會顯示ANT版本號。jsp

wps_clip_image-8321

 

 

 

 

 

基礎入門函數

HelloAnt工程

創建工程目錄以下

wps_clip_image-21860

 

bin存放二進制腳本。output存放打包後的jar文件。src存放源代碼。build.xml文件是Ant腳本。

 

Java文件:HelloANT.java放到src目錄下。

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

 

build.xml文件

<project name="HelloANT" default="run">
    <!--清空bin、output文件夾-->
    <target name="delete">
        <delete dir="bin" includes="*" />
        <delete dir="output" includes="*" />
    </target>
    <!--將src中的java文件編譯至bin文件中-->
    <target name="compile" depends="delete">
        <javac srcdir="src" destdir="bin" />
    </target>
    <!--將bin中的class文件打包成jar文件-->
    <target name="jar" depends="compile">
        <jar destfile="output/HelloANT.jar" basedir="bin" />
    </target>
    <!--運行bin文件中的HelloANT.class文件-->
    <target name="run" depends="jar">
        <java dir="bin" classname="HelloANT" classpath="bin" />
    </target>
</project>

 

進入命令行,cd至build.xml文件存在的目錄中。輸入ant命令。

wps_clip_image-5224

提示「BUILD SUCCESSFUL」,構建成功。

運行輸出了「Hello ANT!!!」。

wps_clip_image-16257

bin目錄下生成Hello.class文件。

wps_clip_image-16952

output目錄下生成HelloANT.jar文件。

wps_clip_image-14523

 

 

 

 

 

Ant腳本簡介

Ant腳本是一個標準的XML文件,Ant腳本默認文件名爲build.xml。

 

Ant腳本結構

Ant腳本的根元素是project,該元素中能夠包含description元素、target元素、property元素和任何Task;target元素中也能夠包含若干Task。project元素是Ant構建文件的根元素,它表示一個Ant工程。也即Ant腳本所定義的工程。

Ant腳本的整體結構如圖:

wps_clip_image-31020

 

 

ant關鍵元素

1. project元素

    project 元素是 Ant 構件文件的根元素, Ant 構件文件至少應該包含一個 project 元素,不然會發生錯誤。在每一個 project 元素下,可包含多個 target 元素。接下來向讀者展現一下 project 元素的各屬性。

  • name 屬性:用於指定 project 元素的名稱。
  • default 屬性:用於指定 project 默認執行時所執行的 target 的名稱。
  • basedir 屬性:用於指定基路徑的位置。該屬性沒有指定時,使用 Ant 的構件文件的附目錄做爲基準目錄。
  • description 屬性:該屬性指定project描述說明。

 

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描述說明。

 

3.task元素

一個task是一段可執行的代碼,也即由一個元素表示,元素的名稱就是該Task的名稱,不一樣的Task中能夠定義不一樣的屬性列表。

Task的通用結構以下:

<name attrubute1=」value1」 attribute2=」value2」 ... />

 

<name attrubute1=」value1」 attribute2=」value2」 ... >
...
</name>

 

 

4. property 元素

    property元素用於定義一個變量。

project 的屬性能夠經過 property 元素來設定,也能夠Ant 以外設定。能夠引入外部文件中的屬性值。例如 build.properties 。

property元素的經常使用屬性:

  • name:指定名稱。
  • value:指定值。
  • resource:指定屬性文件的資源名稱,ant將負責從屬性文件中讀取屬性名和屬性值。
  • file:指定屬性文件的文件名,
  • url:指定屬性文件的URL地址,
  • environment:用於指定系統環境變量的前綴。ant能夠訪問系統環境變量。
  • classpath:指定搜索屬性文件的文件和路徑集。
  • classpathref:指定搜索屬性文件的文件和路徑集引用,該屬性並非直接給出系列文件或路徑,而是給定文件和路徑集引用。

 

使用屬性值
使用$符號使用屬性值。

例:${builddir} 

即輸出builddir屬性值。

 

$符號在Ant生成文件中具備特殊意義。若但願Ant把$當成普通字符,則應該使用$$。

例:

<echo>$${builddir}=${buildir}</echo>

 

輸出爲:[echo] ${builddir}=dd

 

Ant 提供了一些內置的屬性,它能獲得的系統屬性的列表與 Java 文檔中 System.getPropertis() 方法獲得的屬性一致,這些系統屬性可參考 sun 網站的說明。

同時, Ant 還提供了一些它本身的內置屬性,以下:

  • basedir:當前工程的根目錄,由project的basedir屬性定義;
  • ant.file:當前構建腳本的絕對路徑;
  • ant.version:當前運行的Ant 的版本;
  • ant.project.name:當前project的名稱,即project的name屬性值;
  • ant.java.version:當前Ant所使用JVM的版本;
  • ant.home:當前運行的Ant的根目錄,即ANT_HOME的值;

 

 

 

 

ANT經常使用Task

ANT提供了很是多的Task,並且每一個Task都有較多的屬性,因此不會一一列舉了。這裏只對經常使用Task的用法做簡單說明,並給出簡單示例。

 

編譯任務

javac

javac:用於編譯一個或多個Java源文件。

  • srcdir屬性:Java源文件位置。
  • destdir屬性:編譯後的class文件的保存位置。

例:編譯{src}目錄及其子目錄下的全部java文件。class文件將放在{build}指定的目錄下,classpath表示須要用到的類文件或者目錄,debug設置爲on表示輸出debug信息。

<javac srcdir="{src}" destdir="{build}" classpath="xyz.jar" debug="on" />

 

例:編譯{src}和{src2}目錄及其子目錄下的全部。Java文件,可是package/p1/**,mypackage/p2/**將被編譯,而mypackage/p1/testpackage/**將不會被編譯。Class文件將放在{build}指定的目錄下,classpath表示須要用到的類文件或者目錄,debug設置爲on表示輸出debug信息。

<javac srcdir="{src}:{src2}" destdir="{build}" includes="mypackage/p1/**,mypackage/p2/**" excludes="mypackage/p1/testpackage/**" classpath="xyz.jar" debug="on" />

 

例:路徑是在property中定義的。

<property name="classpath" value=".;./xml-apis.jar;../lib/xbean.jar;./easypo.jar"/>
<javac srcdir="{src}" destdir="{src}" classpath="{classpath}" debug="on" />

 

 

歸檔任務(Archive Tasks)

歸檔任務用於對文件系統中的文件進行打包或解包。

jar

  用於生產JAR包,一般須要指定destfile屬性,用於指定所建立JAR包的文件名。一般還指定一個文件集,表示須要將哪些文件打包到JAR包裏。

例:將{build}/classes下面的全部文件打包到{dist}/lib/app.jar中

<jar destfile="{dist}/lib/app.jar" basedir="{build}/classes"/>

 

例:將{build}/classes下面的全部文件打包到{dist}/lib/app.jar中,可是包括mypackage/test/全部文件不包括全部的Test.class

<jar destfile="{dist}/lib/app.jar" basedir="{build}/classes" includes="mypackage/test/**" excludes="**/Test.class" />

 

例:manifest屬性指定本身的META-INF/MANIFEST.MF文件,而不是由系統生成。

<jar destfile="{dist}/lib/app.jar" basedir="{build}/classes" includes="mypackage/test/**" excludes="**/Test.class" manifest="my.mf" />

 

 

war

  該任務用於將一個Web應用打包爲一個war文件。

例:假設文件目錄以下:

thirdparty/libs/jdbc1.jar
thirdparty/libs/jdbc2.jar
build/main/com/myco/myapp/Servlet.class
src/metadata/myapp.xml
src/html/myapp/index.html
src/jsp/myapp/front.jsp
src/graphics/images/gifs/small/logo.gif
src/graphics/images/gifs/large/logo.gif

 

下面是任務的內容:

<war destfile="myapp.war" webxml="src/metadata/myapp.xml">
    <fileset dir="src/html/myapp"/>
    <fileset dir="src/jsp/myapp"/>
    <lib dir="thirdparty/libs">
        <exclude name="jdbc1.jar"/>
    </lib>
    <classes dir="build/main"/>
    <zipfileset dir="src/graphics/images/gifs" prefix="images"/>
</war>

 

完成後的結果:

WEB-INF/web.xml
WEB-INF/lib/jdbc2.jar
WEB-INF/classes/com/myco/myapp/Servlet.class
META-INF/MANIFEST.MF
index.html
front.jsp
images/small/logo.gif
images/large/logo.gif

 

 

執行任務

java

  java:用於運行某個Java類,一般須要classname屬性,用於指定須要運行哪一個類。

例:classname中指定要執行的類,classpath設定要使用的環境變量

<java classname="test.Main">
    <classpath>
        <pathelement location="dist/test.jar"/>
        <pathelement path="{java.class.path}"/>
    </classpath>
</java>

 

 

文件任務

copy

  copy主要用來對文件和目錄的複製功能。舉例以下:

例:複製單個文件併爲複製的文件命名。

<copy file="original.txt" tofile="copied.txt"/>

 

例:將文件複製到另外的目錄。

<copy file="source.txt" todir="../home/philander"/>

 

例:將一個目錄複製到另一個目錄下。

<copy todir="../dest_dir">
      <fileset dir="src_dir"/>
</copy>

例:拷貝一批文件到指定目錄下

<copy todir="../dest/dir">
    <fileset dir="src_dir">
    <include name="**/*.java"/>
    <iexclude name="**/Test.java"/>
    </fileset>
</copy>
<copy todir="../dest/dir">
    <fileset dir="src_dir" excludes="**/*.java"/>
</copy>

 

例:拷貝一批文件到指定目錄下,將文件名後增長。Bak後綴

<copy todir="../backup/dir">
    <fileset dir="src_dir"/>
    <mapper type="glob" from="*" to="*.bak"/>
</copy>

 

 

delete

  對文件或目錄進行刪除,舉例以下:

例:刪除某個文件。

<delete file="/home/photos/philander.jpg"/>

 

例:刪除某個目錄。

<delete dir="/home/photos"/>

 

例:刪除全部的備份目錄或空目錄。

<delete includeEmptyDirs="true">
    <fileset dir="." includes="**/*.bak"/>
</delete>

 

 

mkdir

  建立目錄。

例:<mkdir dir="/home/philander/build/classes"/>

 

 

move

    移動文件或目錄,舉例以下:

例:移動單個文件。

<move file="sourcefile" todir=」movedir」/>

例:移動單個文件到另外一個目錄。

<move file="sourcefile" todir=」movedir」/>

 

例:移動或重命名一個文件

<move file="file.orig" tofile="file.moved"/>

 

例:移動或重命名一個文件到另外一個文件夾下面

<move file="file.orig" todir="dir/to/move/to"/>

 

例:移動某個目錄到另外一個目錄。

<move todir="newdir">
    <fileset dir="olddir"/>
</move>

 

例:將一組文件移動到另外的目錄下

<move todir="some/new/dir">
    <fileset dir="my/src/dir">
        <include name="**/*.jar"/>
        <exclude name="**/ant.jar"/>
    </fileset>
</move>

 

例:移動文件過程當中增長。Bak後綴

<move todir="my/src/dir">
    <fileset dir="my/src/dir">
        <exclude name="**/*.bak"/>
    </fileset>
    <mapper type="glob" from="*" to="*.bak"/>
</move>

 

 

其餘任務

echo

該任務用於輸出指定的消息。默認輸出到標準控制檯,同時能夠經過指定file屬性將消息輸出到文件中。另外,能夠經過level屬性指定在哪一站消息級別下輸出消息。

echo包括 message 、 file 、 append 和 level 四個屬性。

<echo message="Hello,ANT" file="/home/philander/logs/ant.log" append="true">

 

 

 

 

 

命令行中的Ant命令

運行Ant構建腳本

先使用cd命令到達目標文件夾下。

ant:該命令會讓ant自動搜索當前文件夾下的build.xml。若找到,則以該文件做爲生成文件,並執行默認的target。

ant -buildfile a.xml:該命令解析執行當前路徑下的a.xml文件。-buildfile可使用 -f -file代替。

ant -f a.xml:同上。

ant -file a.xml:同上。

 

運行指定的target

默認狀況下下,Ant運行生成文件裏指定的默認target。

ant target :運行時指定須要運行的target。

ant target1 target2 :運行多個target。

ant命令的通常格式:

ant [options] [filename] [targer1 [target2 [target3] ...]]

  • [options]:是可選配置項。
  • [filename]:若文件名爲build.xml則該選項可省略。
  • [targer1 [target2 [target3] ...]] 表示待執行的Target,能夠是任意多個,targer名稱之間用空格隔開。

 

例:ant run

  即運行build.xml文件中名稱爲run的target。

例:ant -f another.xml t1 t2 t3

  即運行another.xml文件中名稱爲t1 t2 t3的target。

 

 

options能夠分別去如下值:

-help 或 -h

打印ant命令的幫助信息。

-projecthelp 或 -p

  打印工程的基本信息,包括工程中的全局Task、Target、default Target等。

-version

  打印Ant版本信息並退出。

-diagnostics

  打印能夠幫助診斷和報告錯誤的系統信息,包括Ant的版本、Ant系統內建屬性的值、Ant庫、Java系統的屬性、計算機的屬性等。

-quiet 或 -q

  ant運行時,只打印Task的輸出信息和重要的出錯信息。讓構建腳本安靜的執行。

-verbose 或 -v

  ant運行時,即打印儘量詳細的信息到輸出終端。

-debug 或 -d

  執行腳本時打印調試信息,調試信息比使用-v打印的詳細信息提供了更豐富的信息。

-emacs 或 -e

  對打印信息不做任何修飾。

-lib <path>

  指定一個搜索庫文件的路徑,包括jar文件和class文件。

-logfile 或 -l <file>

  ant運行時將提示信息輸出到指定文件,而不是直接輸出到控制檯。

例:

ant -verbose -l a.log   運行時ant生產更多的提示信息,並將提示信息輸出到a.log文件中。

-logger <classname>

  指定進行日誌記錄的類。

-listener <classname>

  指定一個類,將該類的實例添加爲工程的一個監聽器。

-noinput

  不容許輸入交互性質的輸入。

-D<property>=<value>

  運行ant命令的同時指定屬性的值,相似於在運行構建腳本時輸入參數。該屬性會覆蓋腳本中的屬性值。

例:

ant -Dbook=Spring2  該命令會覆蓋生成文件中的book屬性值。

ant -Denv=%ANT_HOME% 該命令使用環境變量的值。經過這種方式就能夠將環境變量的值傳入生產文件。在Linux平臺下改成 ant -Denv1=$ANT_HOME。

-keep-going 或 -k

  執行過程當中,若在運行某個Target時出錯,則繼續執行剩餘的全部不依賴於出錯Target的Target。

-propertyfile <name>

  指定一個屬性文件,從文件中裝載全部屬性的值,但若還使用-D指定了相同的屬性,則-D指定的屬性值具備更高的優先級。

-inputhandler <class>

  指定一個類,使用該類處理輸入請求。

-find 或 -s <file>

  從當前目錄逐級向上級目錄搜索指定的構建文件直到文件系統的根目錄。若沒有指定<file>則搜索build.xml,搜索到構建文件後執行構建文件。

-nice number

  設置Ant主線程的優先級,0爲最低,10爲最高,默認爲5。

-nouserlib

  運行腳本的時候不使用用戶目錄庫中的jar文件。

-noclasspath

  運行腳本的時候不使用類路徑。

-autoproxy

  在Java1.5以上的運行環境中,該設置在運行Ant腳本時自動使用操做系統配置的代理服務器。

-main <class>

  指定一個主函數的類,該主函數將覆蓋Ant的常規主函數,提供新的運行入口點。

 

 

 

 

該文僅爲學習文檔,更多詳細資料可參考官方教程

http://ant.apache.org/manual/index.html

相關文章
相關標籤/搜索