<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-57  評論-117  文章-1  trackbacks-0
     

    一、概述

    ant 是一個將軟件編譯、測試、部署等步驟聯(lián)系在一起加以自動化的一個工具,大多用于Java環(huán)境中的軟件開發(fā)。在實際軟件開發(fā)中,有很多地方可以用到ant。

     

    開發(fā)環(huán)境:

    System:Windows

    JDK:1.6+

    IDE:eclipse

    ant:1.9.1

     

    Email:hoojo_@126.com

    Blog:http://blog.csdn.net/IBM_hoojo

    http://hoojo.cnblogs.com/

     

    二、優(yōu)點

    ant 是Apache軟件基金會JAKARTA目錄中的一個子項目,它有以下的優(yōu)點:
    1、跨平臺性:Ant是純Java語言編寫的,所以具有很好的跨平臺性。
    2、操作簡單:Ant是由一個內(nèi)置任務(wù)和可選任務(wù)組成的,用ant任務(wù)就像是在dos中寫命令行一樣。Ant運行時需要一個XML文件(構(gòu)建文件)。 Ant通過調(diào)用target樹,就可以執(zhí)行各種task。每個task實現(xiàn)了特定接口對象。
    3、維護(hù)簡單、可讀性好、集成簡單:由于Ant構(gòu)建文件 時XML格式的文件,所以很容易維護(hù)和書寫,而且結(jié)構(gòu)很清晰。Ant可以集成到開發(fā)環(huán)境中。由于Ant的跨平臺性和操作簡單的特點,它很容易集成到一些開發(fā)環(huán)境中去。

     

    三、安裝和配置

    1、下載ant,http://mirror.esocc.com/apache//ant/binaries/apache-ant-1.9.1-bin.zip

    2、解壓zip壓縮包,將壓縮包放置你要放置的目錄。我這里放置在D:\apache-ant-1.9.1,目錄結(jié)構(gòu)如下:

    image

    bin是ant的程序運行入口,如果沒有配置ANT_HOME的情況下,可以通過bin目錄中的bat程序進(jìn)行運行build任務(wù)。

    如:在cmd中運行ant.bat就可以執(zhí)行程序,當(dāng)然你選擇要當(dāng)前目錄中存在一個build.xml(build.xml是默認(rèn)的ant執(zhí)行文件,當(dāng)然你可以指定其他文件)

    image

    etc目錄中存放的都是一些xsl的輸出模板,創(chuàng)建一個加強的導(dǎo)出各種任務(wù)的XML輸出,使你的build文件擺脫過時的警告

    lib目錄中存放的是ant程序需要依賴的jar包

    manual目錄是ant程序的幫助文檔

    3、在我的電腦 –> 右鍵屬性 –> 高級系統(tǒng)配置 -> 環(huán)境變量 中配置ant

    新建系統(tǒng)變量 ANT_HOME = D:\apache-ant-1.9.1

    image

    這樣環(huán)境變量就配置好了,但前提你需要配置jdk的環(huán)境變量。如果你沒有配置jdk的環(huán)境變量,那么請你先配置好jdk變量。jdk環(huán)境配置方法如下:

    (1),安裝JDk到其默認(rèn)目錄:C:\Program Files\Java\jdk1.5.0_05 (沒有jdk去官方下載一個)
    C:\Program Files\Java\jdk1.5.0
    作用:告訴系統(tǒng)JVM在什么地方

    (2),右擊我的電腦,選屬性,高級,環(huán)境變量
    (3),在系統(tǒng)變量欄點新建,出現(xiàn)新建系統(tǒng)變量對話框,在變量名中填上JAVA_HOME ,變量值:C:\Program Files\Java\jdk1.5.0_05
    (4),確定后在系統(tǒng)變量(S)欄再新建一個環(huán)境變量CLASSPATH,變量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar(開頭的dot和;不能少)
    (5),確定后在系統(tǒng)變量(S)欄查找并選中變量為Path的選項,點編輯在變量值(V)的末尾添加:
    %JAVA_HOME%\bin     

    如果沒有找到PATH變量,自己新建一個!
    如果你不想每次運行都要cmd到class所在目錄然后執(zhí)行java命令,可以把所有的class文件放到統(tǒng)一的目錄組織下,然后將此目錄也追加到CLASSPATH下。

    測試代碼如下:

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

    用記事本編輯后存為Test.java(文件名與類名相同)文件,打開命令行窗口,
    cd到文件所在目錄下:
    javac Test.java                       //編譯命令
    java Test                                //執(zhí)行程序
    如果輸出為:Hello World!       OK,配置完畢,否則,重新檢查。

     

    四、測試ant

    在啟動,運行cmd的dos窗口中輸入ant,如圖:

    image

    如果出現(xiàn)這個,那么恭喜你安裝成功了!否則就失敗了,檢查下前面的步驟有沒有錯誤。上面命令會執(zhí)行ant程序,ant默認(rèn)執(zhí)行build.xml中的任務(wù),這里在Administrator目錄中沒有這個文件。

    如果安裝失敗,你看看是否存在一些情況:

    1、沒有配置JAVA_HOME 或配置錯誤,并且JAVA_HOME\bin\java.exe存在

    2、沒有配置ANT_HOEM 或配置錯誤,并且ANT_HOME\bin\ant.bat存在

    3、檢查你的環(huán)境變量的path變量中,有木有配置...;%ANT_HOME%\bin;...

    %PATH%=...maybe-other-entries...;%ANT_HOME%\bin;...maybe-other-entries...

     

    五、ant的運行時環(huán)境

    ant在運行命令的時候,有時候會出現(xiàn)一些公園的jar庫。這些庫會存在于每個ant工程中,那么這個時候我們可以把這個jar包放到ant_home\lib目錄中作為全局的庫使用。

    如果你不想“污染”原始的ant程序,那么你可以把jar包放在當(dāng)前windows用戶的目錄下,具體位置應(yīng)該是${user.home}/.ant/lib 下。沒有以上目錄可以手動建立。

    如果你只是臨時要添加lib,又不想把lib添加到當(dāng)前ant工程中。你可以在運行ant程序的時候指定依賴的lib參數(shù)。

    image

    同時,你還可以在當(dāng)前build工程的classpath目錄中添加你的工程依賴jar包。

    六、ant命令

    image

    語法元素說明如下:
    -help
    顯示描述ant 命令及其選項的幫助信息
    -projecthelp
    顯示包含在構(gòu)建文件中的、所有用戶編寫的幫助文檔。即為各個<target>中description 屬性的文本,以及包含在<description>元素中的任何文本。將有description 屬性的目標(biāo)列為主目標(biāo)(Main target),沒有此屬性的目標(biāo)則列為子目標(biāo)(Subtarget)。
    -version
    要求ant 顯示其版本信息,然后退出。
    -quiet
    抑制并非由構(gòu)建文件中的echo 任務(wù)所產(chǎn)生的大多數(shù)消息。
    -verbose
    顯示構(gòu)建過程中每個操作的詳細(xì)消息。此選項與-debug 選項只能選其一。
    -debug
    顯示Ant 和任務(wù)開發(fā)人員已經(jīng)標(biāo)志為調(diào)試消息的消息。此選項與-verbose 只能選其一。
    -emacs
    對日志消息進(jìn)行格式化,使它們能夠很容易地由Emacs 的shell 模式(shellmode)所解析;也就是說,打印任務(wù)事件,但并不縮排,在其之前也沒有[taskname]。
    -logfile filename
    將日志輸出重定向到指定文件。
    -logger classname
    指定一個類來處理Ant 的日志記錄。所指定的類必須實現(xiàn)了org.apache.tools.ant.BuildLogger 接口。
    -listener classname
    為Ant 聲明一個監(jiān)聽類,并增加到其監(jiān)聽者列表中。在Ant與IDE或其他Java程序集成時,此選項非常有用。可以閱讀第六章以了解有關(guān)監(jiān)聽者的更多信息。必須將所指定的監(jiān)聽類編寫為可以處理Ant 的構(gòu)建消息接發(fā)。
    -buildfile filename
    指定Ant 需要處理的構(gòu)建文件。默認(rèn)的構(gòu)建文件為build.xml。
    -Dproperty=value
    在命令行上定義一個特性名-值對。
    -find filename
    指定Ant 應(yīng)當(dāng)處理的構(gòu)建文件。與-buildfile 選項不同,如果所指定文件在當(dāng)前目錄中未找到,-find 就要求Ant 在其父目錄中再進(jìn)行搜索。這種搜索會繼續(xù)在其祖先目錄中進(jìn)行,直至達(dá)到文件系統(tǒng)的根為止,在此如果文件還未找到,則構(gòu)建失敗。
    -atuoproxy jdk1.5以上的可以使用代理設(shè)置
    -nouserlib 運行ant時不使用用戶lib中的jar包
    -nice 設(shè)計主線程優(yōu)先級
    -logfile 使用指定的log日志
    -noinput 不允許交互輸入
    -keep-going, -k 執(zhí)行不依賴于所有目標(biāo)
    -propertyfile 加載所有屬性配置文件 -d 屬性文件優(yōu)先

    <project default="all">
        <property name="pro_a" value="a value" />
        <property name="pro_b" value="b value" />
        
        <path id="rt.path">
            <pathelement location="${java.home}/jre/lib/rt.jar" />
        </path>
        
        <target name="all">
            <javac srcdir=".">
                <classpath refid="a.path" />
            </javac>
        </target>
    </project>

    注意:
    ● 所有構(gòu)建文件都要有<project>元素,而且至少有一個<target> 元素。
    ● 對于<project> 元素的default 屬性并不一定需要默認(rèn)值。
    ● 構(gòu)建文件并不一定要被命名為build.xml。不過build.xml 是ant 要搜索的默認(rèn)文件名。
    ● 每個構(gòu)建文件只能有一個<project> 元素。

    在cmd窗口中進(jìn)入到當(dāng)前build.xml目錄

    ant
    在當(dāng)前目錄下的build.xml運行Ant,執(zhí)行缺省的target。

    ant -buildfile build-test.xml
    在當(dāng)前目錄下的build-test.xml運行Ant,執(zhí)行缺省的target。

    ant -buildfile build-test.xml clean
    在當(dāng)前目錄下的build-test.xml運行Ant,執(zhí)行一個叫做clean的target。

    ant -buildfile build-test.xml -Dbuild=build/classes clean
    在當(dāng)前目錄下的build-test.xml運行Ant,執(zhí)行一個叫做clean的target,并設(shè)定build屬性的值為build/classes。

    七、ant腳本:使用節(jié)點、元素和屬性、命令指令

    1、project 節(jié)點元素

    project 元素是 Ant 構(gòu)件文件的根元素, Ant 構(gòu)件文件至少應(yīng)該包含一個 project 元素,否則會發(fā)生錯誤。在每個 project 元素下,可包含多個 target 元素。接下來向讀者展示一下 project 元素的各屬性。
    ● name 屬性:用于指定 project 元素的名稱。
    ● default 屬性:用于指定 project 默認(rèn)執(zhí)行時所執(zhí)行的 target 的名稱。
    ● basedir 屬性:用于指定基路徑的位置。該屬性沒有指定時,使用 Ant 的構(gòu)件文件的附目錄作為基準(zhǔn)目錄。

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

    從上例可以看出,在這里定義了default 屬性的值為print-dir,即當(dāng)運行ant 命令時,如果沒有指明執(zhí)行的target,則將執(zhí)行默認(rèn)的target(print-dir)。此外,還定義了basedir 屬性的值為 “.” ,.表示當(dāng)前目錄,進(jìn)入當(dāng)前目錄后運行ant 命令,得一下結(jié)果:

     image

    2、target節(jié)點元素

    target為ant的基本執(zhí)行單元或是任務(wù),它可以包含一個或多個具體的單元/任務(wù)。多個target 可以存在相互依賴關(guān)系。它有如下屬性:
    ● name 屬性:指定 target 元素的名稱,這個屬性在一個 project 元素中是唯一的。我們可以通過指定 target 元素的名稱來指定某個 target 。
    ● depends 屬性:用于描述 target 之間的依賴關(guān)系,若與多個 target 存在依賴關(guān)系時,需要以“,”間隔。 Ant 會依照 depends 屬性中 target 出現(xiàn)的順序依次執(zhí)行每個 target ,被依賴的target 會先執(zhí)行。
    ● if 屬性:用于驗證指定的屬性是存在,若不存在,所在 target 將不會被執(zhí)行。
    ● unless 屬性:該屬性的功能與 if 屬性的功能正好相反,它也用于驗證指定的屬性是否存在,若不存在,所在 target 將會被執(zhí)行。
    ● description 屬性:該屬性是關(guān)于 target 功能的簡短描述和說明。
    示例:

    <?xml version="1.0" ?>
    <project name="ant-target" default="print">
        <target name="version" if="ant.java.version">
            <echo message="Java Version: ${ant.java.version}" />
        </target>
        <target name="print" depends="version" unless="docs">
            <description>
                a depend example!
            </description>
            <echo message="The base dir is: ${basedir}" />
        </target>
    </project>

    從以下結(jié)果后可以看到,我們運行的是名為 print的target ,由于它依賴于version這個target任務(wù),所以 version將首先被執(zhí)行,同時因為系統(tǒng)配置了JDK,所以 ant.java.version 屬性存在,執(zhí)行了version,輸出信息:"[echo] Java Version: 1.6 ",version執(zhí)行完畢后,接著執(zhí)行 print,因為docs不存在,而unless屬性是在不存在時進(jìn)入所在target 的,由此可知 print得以執(zhí)行,輸出信息:"[echo] The base dir is:D:\Workspace\AntExample\build"。

    image 

    3、property屬性節(jié)點元素

    property元素可看作參量或者參數(shù)的定義,project 的屬性可以通過 property 元素來設(shè)定,也可在 Ant 之外設(shè)定。若要在外部引入某文件,例如 build.properties 文件,可以通過如下內(nèi)容將其引:
    <property file="build.properties"/>
    property 元素可用作 task 的屬性值。在 task 中是通過將屬性名放在${屬性名}之間,并放在 task 屬性值的位置來實現(xiàn)的。
    Ant 提供了一些內(nèi)置的屬性,它能得到的系統(tǒng)屬性的列表與 Java 文檔中 System.getProperties() 方法得到的屬性一致,這些系統(tǒng)屬性可參考 sun 網(wǎng)站的說明。同時, Ant 還提供了一些它自己的內(nèi)置屬性,如下:
    basedir: project 基目錄的絕對路徑;  
    ant.file: buildfile的絕對路徑,上例中ant.file值為D:\Workspace\AntExample\build;
    ant.version: Ant 的版本信息,本文為1.8.1 ;
    ant.project.name: 當(dāng)前指定的project的名字,即前文說到的project的name屬性值;
    ant.java.version: Ant 檢測到的JDK版本,本文為 1.6 。

    舉例說明如下:

    <project name="ant-project" default="example">
        <property name="name" value="jojo" />
        <property name="age" value="25" />
        <target name="example">
            <echo message="name: ${name}, age: ${age}" />
        </target>
    </project>

    上例中用戶設(shè)置了名為name 和age的兩個屬性,這兩個屬性設(shè)置后,在下文中可以通過 ${name} 和 ${age} 分別取得這兩個屬性值。

    4、copy命令

    copy主要用來對文件和目錄的復(fù)制功能。舉例如下:
    ● 復(fù)制單個文件:
    <copy file="old.txt" tofile="new.txt"/>

    ● 對文件目錄進(jìn)行復(fù)制:
    <copy todir="../dest_dir">
        <fileset dir="src_dir"/>
    </copy>

    ● 將文件復(fù)制到另外的目錄:
    <copy file="src.txt" todir="c:/base"/>

    5、delete命令

    對文件或目錄進(jìn)行刪除,舉例如下:

    ● 刪除某個文件:   
    <delete file="/res/image/cat.jpg"/>

    ● 刪除某個目錄:   
    <delete dir="/res/image"/>

    ● 刪除所有的jar文件或空目錄:
    <delete includeEmptyDirs="true">
           <fileset dir="." includes="**/*.jar"/>
    </delete>

    6、 mkdir 命令

    創(chuàng)建目錄。
    <mkdir dir="/home/philander/build/classes"/>

    7、 move 命令

    移動文件或目錄,舉例如下:
    ● 移動單個文件:
    <move file="sourcefile" tofile=”destfile”/>

    ● 移動單個文件到另一個目錄:
    <move file="sourcefile" todir=”movedir”/>

    ● 移動某個目錄到另一個目錄:
    <move todir="newdir">
        <fileset dir="olddir"/>
    </move>

    8、echo 命令

    該任務(wù)的作用是根據(jù)日志或監(jiān)控器的級別輸出信息。它包括 message 、 file 、 append 和 level 四個屬性,舉例如下
    <echo message="ant message" file="/logs/ant.log" append="true">

    9、jar 標(biāo)簽節(jié)點元素

    該標(biāo)簽用來生成一個JAR文件,其屬性如下。
    ● destfile表示JAR文件名。
    ● basedir表示被歸檔的文件名。
    ● includes表示別歸檔的文件模式。
    ● exchudes表示被排除的文件模式。

    ● compress表示是否壓縮。

    示例:

    <jar destfile="${webRoot}/${ash_jar}" level="9" compress="true" encoding="utf-8" basedir="${dest}">
        <manifest>
            <attribute name="Implementation-Version" value="Version: 2.2"/>
        </manifest>
    </jar>

    上面的mainfest是jar包中的MEAT-INF中的MANIFEST.MF中的文件內(nèi)容

    同樣打包操作的的還有war、tgz,已經(jīng)解壓操作uzip

    <!-- 創(chuàng)建zip -->
    <zip basedir="${basedir}\classes" zipfile="temp\output.zip"/> 
    <!-- 創(chuàng)建tgz -->
    <gzip src="classes\**\*.class" zipfile="output.class.gz"/>
    <!-- 解壓zip -->
    <unzip src="output.class.gz" dest="extractDir"/>
    <!-- 建立war包 -->
    <war destfile="${webRoot}/ash.war" basedir="${basedir}/web" webxml="${basedir}/web/WEB-INF/web.xml">
        <exclude name="WEB-INF/classes/**"/>
        <exclude name="WEB-INF/lib/**"/>
        <exclude name="WEB-INF/work/_jsp/**"/>
        <lib dir="${lib.dir}" includes="**/*.jar, **/*.so, **/*.dll">
            <exclude name="${webRoot}\${helloworld_jar}"/>
        </lib>
        <lib file="${webRoot}/${helloworld_jar}"/>
        <classes dir="${dest}" includes="**/*.xml, **/*.properites, **/*.xsd"> </classes>
    </war>

    10、javac 標(biāo)簽節(jié)點元素

    該標(biāo)簽用于編譯一個或一組java文件,其屬性如下。
    ● srcdir表示源程序的目錄。
    ● destdir表示class文件的輸出目錄。
    ● include表示被編譯的文件的模式。
    ● excludes表示被排除的文件的模式。
    ● classpath表示所使用的類路徑。
    ● debug表示包含的調(diào)試信息。
    ● optimize表示是否使用優(yōu)化。
    ● verbose 表示提供詳細(xì)的輸出信息。
    ● fileonerror表示當(dāng)碰到錯誤就自動停止。

    示例

    <javac srcdir="${src}" destdir="${dest}"/>
    <!-- 設(shè)置jvm內(nèi)存
    <javac srcdir="src" fork="true"/> 
    <javac srcdir="src" fork="true" executable="d:\sdk141\bin\javac" 
    memoryMaximumSize="128m"/> 
    -->

    11、java 標(biāo)簽節(jié)點元素

    該標(biāo)簽用來執(zhí)行編譯生成的.class文件,其屬性如下。
    ● classname 表示將執(zhí)行的類名。
    ● jar表示包含該類的JAR文件名。
    ● classpath所表示用到的類路徑。
    ● fork表示在一個新的虛擬機中運行該類。
    ● failonerror表示當(dāng)出現(xiàn)錯誤時自動停止。
    ● output 表示輸出文件。
    ● append表示追加或者覆蓋默認(rèn)文件。

    示例

    <java classname="com.hoo.test.HelloWorld" classpath="${hello_jar}"/>

    12、arg 數(shù)據(jù)參數(shù)元素

    由Ant構(gòu)建文件調(diào)用的程序,可以通過<arg>元素向其傳遞命令行參數(shù),如apply,exec和java任務(wù)均可接受嵌套<arg>元素,可以為各自的過程調(diào)用指定參數(shù)。以下是<arg>的所有屬性。
    ● values 是一個命令參數(shù)。如果參數(shù)中有空格,但又想將它作為單獨一個值,則使用此屬性。
    ● file 表示一個參數(shù)的文件名。在構(gòu)建文件中,此文件名相對于當(dāng)前的工作目錄。
    ● line 表示用空格分隔的多個參數(shù)列表。
    ● 表示路徑,一個作為單個命令行變量的path-like的字符串;或作為分隔符,Ant會將其轉(zhuǎn)變?yōu)樘囟ㄆ脚_的分隔符。
    ● pathref 引用的path(使用path元素節(jié)點定義path)的id
    ● prefix 前綴
    ● suffix 后綴

    例子
    <arg value="-l -a"/>
    是一個含有空格的單個的命令行變量。
    <arg line="-l -a"/>
    是兩個空格分隔的命令行變量。
    <arg path="/dir;/dir2:\dir3"/>
    是一個命令行變量,其值在DOS系統(tǒng)上為\dir;\dir2;\dir3;在Unix系統(tǒng)上為/dir:/dir2:/dir3 。

    13、ervironment 類型

    由Ant構(gòu)建文件調(diào)用的外部命令或程序,<env>元素制定了哪些環(huán)境變量要傳遞給正在執(zhí)行的系統(tǒng)命令,<env>元素可以接受以下屬性。
    ● file表示環(huán)境變量值的文件名。此文件名要被轉(zhuǎn)換位一個絕對路徑。
    ● path表示環(huán)境變量的路徑。Ant會將它轉(zhuǎn)換為一個本地約定。
    ● value 表示環(huán)境變量的一個直接變量。
    ● key 表示環(huán)境變量名。
    注意 file path 或 value只能取一個。

    14、filelist 文件集合列表

    filelist 是一個支持命名的文件列表的數(shù)據(jù)類型,包含在一個filelist類型中的文件不一定是存在的文件。以下是其所有的屬性。
    ● dir是用于計算絕對文件名的目錄。
    ● files 是用逗號分隔的文件名列表。
    ● refid 是對某處定義的一個<filelist>的引用。
    注意 dir 和 files 都是必要的,除非指定了refid(這種情況下,dir和files都不允許使用)。

    示例

    <filelist id="docfiles" dir="${doc.src}" files="foo.xml,bar.xml"/> 
    文件集合 ${doc.src}/foo.xml和${doc.src}/bar.xml. 這些文件也許還是不存在的文件.
    <filelist id="docfiles" dir="${doc.src}" files="foo.xml bar.xml"/> 
     
    <filelist refid="docfiles"/> 
     
    <filelist id="docfiles" dir="${doc.src}">
        <file name="foo.xml"/>
        <file name="bar.xml"/>
    </filelist>

    15、fileset 文件類型

    fileset 數(shù)據(jù)類型定義了一組文件,并通常表示為<fileset>元素。不過,許多ant任務(wù)構(gòu)建成了隱式的fileset,這說明他們支持所有的fileset屬性和嵌套元素。以下為fileset 的屬性列表。
    ● dir表示fileset 的基目錄。
    ● casesensitive的值如果為false,那么匹配文件名時,fileset不是區(qū)分大小寫的,其默認(rèn)值為true.
    ● defaultexcludes 用來確定是否使用默認(rèn)的排除模式,默認(rèn)為true。
    ● excludes 是用逗號分隔的需要派出的文件模式列表。
    ● excludesfile 表示每行包含一個排除模式的文件的文件名。
    ● includes 是用逗號分隔的,需要包含的文件模式列表。
    ● includesfile 表示每行包括一個包含模式的文件名。

    示例

    <fileset id="lib.runtime" dir="${lib.path}/runtime">
        <include name="**/*.jar"/>
        <include name="**/*.so"/>
        <include name="**/*.dll"/>
    </fileset>
     
    <fileset id="lib.container" dir="${lib.path}/container">
        <include name="**/*.jar"/>
    </fileset>
     
    <fileset id="lib.extras" dir="${lib.path}">
        <include name="test/**/*.jar"/>
    </fileset>

    16、patternset 類型

    fileset 是對文件的分組,而patternset是對模式的分組,他們是緊密相關(guān)的概念。

    <patternset>支持4個屬性:includes、excludex、includexfile、excludesfile,這些與fileset相同。

    patternset 還允許以下嵌套元素:include,exclude,includefile 和 excludesfile.

    示例

    <!-- 黑白名單 -->
    <patternset id="non.test.sources">
      <include name="**/*.java"/>
      <!-- 文件名包含Test的排除 -->
      <exclude name="**/*Test*"/>
    </patternset>
     
     
    <patternset id="sources">
      <include name="std/**/*.java"/>
      <!-- 判斷條件 存在professional就引入 -->
      <include name="prof/**/*.java" if="professional"/>
      <exclude name="**/*Test*"/>
    </patternset>
     
    <!-- 一組文件 -->
    <patternset includesfile="some-file"/>
    <patternset>
      <includesfile name="some-file"/> 
    <patternset/>
     
    <patternset>
      <includesfile name="some-file"/> 
      <includesfile name="${some-other-file}" if="some-other-file"/> 
    <patternset/>

    17、filterset 類型

    filterset定義了一組過濾器,這些過濾器將在文件移動或復(fù)制時完成文件的文本替換。
    主要屬性如下:
    ● begintoken 表示嵌套過濾器所搜索的記號,這是標(biāo)識其開始的字符串。
    ● endtoken 表示嵌套過濾器所搜索的記號這是標(biāo)識其結(jié)束的字符串。
    ● id 是過濾器的唯一標(biāo)志符。
    ● refid 是對構(gòu)建文件中某處定義一個過濾器的引用。

    示例

    <!-- 將目標(biāo)文件build.dir目錄中的version.txt文件內(nèi)容中的@DATE@替換成TODAY當(dāng)前日期的值,并把替換后的文件存放在dist.dir目錄中 -->
    <copy file="${build.dir}/version.txt" toFile="${dist.dir}/version.txt">
      <filterset>
        <filter token="DATE" value="${TODAY}"/>
      </filterset>
    </copy>
     
    <!-- 自定義變量的格式 -->
    <copy file="${build.dir}/version.txt" toFile="${dist.dir}/version.txt">
      <!-- 從version.txt中的%位置開始搜索,到*位置結(jié)束,進(jìn)行替換內(nèi)容中的@DATE@替換成TODAY當(dāng)前日期的值-->
      <filterset begintoken="%" endtoken="*">
        <filter token="DATE" value="${TODAY}"/>
      </filterset>
    </copy>
     
    <!-- 使用外部的過濾定義文件 -->
    <copy toDir="${dist.dir}/docs">
      <fileset dir="${build.dir}/docs">
        <include name="**/*.html">
      </fileset>
      <filterset begintoken="%" endtoken="*">
        <!-- 過來文件從外部引入,過來的屬性和值配置在dist.properties文件中 --> 
        <filtersfile file="${user.dir}/dist.properties"/>
      </filterset>
    </copy>
     
    <!-- 使用引用方式,重復(fù)利用過濾集 -->
    <filterset id="myFilterSet" begintoken="%" endtoken="*">
      <filter token="DATE" value="${TODAY}"/>
    </filterset>
     
    <copy file="${build.dir}/version.txt" toFile="${dist.dir}/version.txt">
      <filterset refid="myFilterSet"/>
    </copy>

    18、path類型

    path元素用來表示一個類路徑,不過它還可以用于表示其他的路徑。在用作幾個屬性時,路經(jīng)中的各項用分號或冒號隔開。在構(gòu)建的時候,此分隔符將代替當(dāng)前平臺中所有的路徑分隔符,其擁有的屬性如下。
    ● location 表示一個文件或目錄。Ant在內(nèi)部將此擴(kuò)展為一個絕對路徑。
    ● refid 是對當(dāng)前構(gòu)建文件中某處定義的一個path的引用。
    ● path表示一個文件或路徑名列表。

    示例

    <path id="buildpath">
        <fileset refid="lib.runtime"/>
        <fileset refid="lib.container"/>
        <fileset refid="lib.extras"/>
    </path>
     
    <path id="src.paths">
        <fileset id="srcs" dir=".">
            <include name="src/**/*.java"/>
        </fileset>
    </path>

     

    八、ant編譯打包、運行工程

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- name是當(dāng)前工程的名稱,default是默認(rèn)執(zhí)行的任務(wù),basedir是工作目錄(.代表當(dāng)前根目錄) -->
    <project name="HelloWorld" default="run" basedir=".">
        <!-- property類似于程序中定義簡單的變量 -->
        <property name="src" value="src"/>
        <property name="dest" value="classes"/>
        <property name="hello_jar" value="helloWorld.jar"/>
        <!-- 
        target是一個事件、事情、任務(wù), name是當(dāng)前事情的名稱,depends是依賴的上一件或是多件事情
        如果所依賴的事情沒有執(zhí)行,ant會先運行依賴事情,然后再運行當(dāng)前事情
        -->
        
        <!-- 初始化 -->
        <target name="init">
            <!-- 建立classes目錄 -->
            <mkdir dir="${dest}"/>
            <mkdir dir="temp"/>
            <mkdir dir="temp2"/>
        </target>
        
        <!-- 編譯 -->
        <target name="compile" depends="init">
            <javac srcdir="${src}" destdir="${dest}"/>
            <!-- 設(shè)置jvm內(nèi)存
            <javac srcdir="src" fork="true"/> 
            <javac srcdir="src" fork="true" executable="d:\sdk141\bin\javac" 
            memoryMaximumSize="128m"/> 
            -->
        </target>
        
        <!-- 建立jar包 -->
        <target name="build" depends="compile">
            <!-- 
            <jar jarfile="${hello_jar}" basedir="${dest}"/>
            創(chuàng)建一個名稱是package.jar文件
            <jar destfile="package.jar" basedir="classes"/> 
            -->
            <jar destfile="${hello_jar}" basedir="classes"> 
                <!-- 向jar包中的main文件中添加內(nèi)容 -->
                <manifest> 
                    <attribute name="Built-By" value="${user.name}"/> 
                    <attribute name="Main-class" value="package.Main"/> 
                </manifest> 
            </jar> 
            <!-- 復(fù)制jar文件  todir="復(fù)制到目錄"-->
            <copy file="${hello_jar}" tofile="${dest}\temp.jar"/> 
            <copy todir="temp"> 
                <!-- 不按照默認(rèn)方式 defaultexcludes="" -->
                  <fileset dir="src"> 
                    <include name="**/*.java"/>
                  </fileset> 
            </copy> 
            
            <copy todir="temp2"> 
                <fileset dir="src">
                    <and>
                        <contains text="main"/> 
                        <size value="1" when="more"/> 
                    </and>
                </fileset>
            </copy> 
            
            <!-- 移動jar文件 -->
            <move file="${dest}\temp.jar" tofile="temp\move-temp.jar"/> 
            <!-- 創(chuàng)建zip -->
            <zip basedir="${basedir}\classes" zipfile="temp\output.zip"/> 
            <!-- 創(chuàng)建tgz -->
            <gzip src="classes\**\*.class" zipfile="output.class.gz"/>
            <!-- 解壓zip -->
            <unzip src="output.class.gz" dest="extractDir"/> 
            <!--替換input.txt內(nèi)容中的old為new
            <replace file="input.txt" token="old" value="new"/>
            --> 
        </target>
        
        <!-- 運行 -->
        <target name="run" depends="build">
            <java classname="com.hoo.test.HelloWorld" classpath="${hello_jar}"/>
        </target>
        
        <!-- 清除 -->
        <target name="clean">
            <!-- 刪除生成的文件 -->
            <delete dir="${dest}"/>
            <delete file="${hello_jar}"/>
        </target>
        
        <tstamp> 
           <format property="OFFSET_TIME" 
                   pattern="HH:mm:ss" 
                   offset="10" unit="minute"/> 
        </tstamp>
        
        <!-- 重新運行 -->
        <target name="rerun" depends="clean,run">
            <echo message="###${TSTAMP}#${TODAY}#${DSTAMP}###"/>
            <aunt target="clean"/>
            <aunt target="run"/>
        </target>
    </project>

    要說的的東西基本上就那么多,ant還有很多內(nèi)容沒有提到,有興趣的可以自己去研究研究。ant不難,你用它就像是在docs控制臺輸入命令行一樣,只不過ant是將命令行轉(zhuǎn)換為xml的腳本信息,可以進(jìn)行重復(fù)的運行。在一定情況下,提高了效率和重復(fù)的工作。



    作者:hoojo
    出處:
    blog:http://blog.csdn.net/IBM_hoojo
             http://hoojo.cnblogs.com
    本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。


    版權(quán)所有,轉(zhuǎn)載請注明出處 本文出自:
    分享道版權(quán)所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處,謝謝
    posted on 2013-06-14 13:07 hoojo 閱讀(7487) 評論(2)  編輯  收藏 所屬分類: JavaEEOthers

    評論:
    # re: ant 入門使用指南 2013-06-17 16:38 | tb
    經(jīng)典入門手冊  回復(fù)  更多評論
      
    # re: ant 入門使用指南 2013-06-21 09:56 | 天津汽車租賃
    還是挺好的呀  回復(fù)  更多評論
      
    主站蜘蛛池模板: 一边摸一边桶一边脱免费视频| 国产精品酒店视频免费看| 亚洲产国偷V产偷V自拍色戒| 免费国产在线精品一区| 在线播放免费播放av片| 亚洲jjzzjjzz在线观看| 99re在线视频免费观看| 亚洲va在线va天堂va888www| 人妻在线日韩免费视频| 国产AⅤ无码专区亚洲AV| 人妻免费久久久久久久了| 免费v片在线观看品善网| WWW国产亚洲精品久久麻豆| 性色av免费观看| 亚洲乱码在线观看| 97人伦色伦成人免费视频| 亚洲av永久综合在线观看尤物| 亚洲一区二区免费视频| 亚洲日本va午夜中文字幕一区| 久久久久久久99精品免费| 亚洲国产精品第一区二区 | 免费观看在线禁片| 亚洲日韩激情无码一区| 美女网站在线观看视频免费的| 亚洲午夜久久久久妓女影院| 久久WWW免费人成—看片| a级亚洲片精品久久久久久久| caoporn国产精品免费| 伊人婷婷综合缴情亚洲五月| 国产成人无码精品久久久久免费 | 免费观看的a级毛片的网站| 亚洲最大天堂无码精品区| 免费观看美女裸体网站| 国产精品亚洲AV三区| 亚洲AV无码乱码在线观看牲色| 四虎影视久久久免费观看| 久久精品国产精品亚洲下载| 国内精品免费久久影院| 亚洲AV日韩AV天堂久久 | 怡红院亚洲红怡院在线观看| 亚洲AV日韩精品一区二区三区|