採用Ant打包

好久沒更博了,最近研究了一下Ant打包機制,作一下記錄。首先簡要介紹一下Ant。
Ant是一個基於Java的生成(在軟件開發中用來將源代碼和其他輸入文件轉換爲可執行文件的形式)工具,最常用的就是用Ant打包war文件。在使用Ant打包之前需要搭建一個ant環境,大致分爲一下幾步:
1、安裝jdk並配置環境變量(JAVA_HOME、CLASSPATH、PATH);
2、下載Ant並解壓;
3、新建環境變量ANT_HOME=解壓路徑,並在PATH後追加ANT_HOME目錄下的bin目錄(如ANT_HOME:D:\apache-ant-1.8.2,PATH:%ANT_HOME%\bin);
4、測試一下你的設置,開始–>運行–>cmd進入命令行–>鍵入 ant 回車,如果看到
Buildfile: build.xml does not exist!
Build failed
那麼你的Ant環境搭建成功。
使用Ant打包的好處是在多次調試運行中不需要手動的用javac 、copy 、jar、java來一次次的完成,可以批量地完成這些重複操作。因此,ant需要一個構建文件來定義以上這些操作,構建文件一般命名爲build.xml,也可以使用其他自己定義的名字,但是在調用的時候需要加上-buildfile參數,如ant -buildfile mybuild.xml。下面介紹一下如何建立一個構建文件。
Ant構建文件是XML文件。每個構建文件定義一個唯一的項目(Project標籤)。每個項目下可以定義很多目標(target標籤),這些目標之間可以有依賴關係。當執行這類目標時,需要執行他們所依賴的目標。每個目標中可以定義多個任務,目標中還定義了所要執行的任務序列。Ant在構建目標時必須調用所定義的任務。任務定義了Ant實際執行的命令。Ant中的任務可以爲3類。
(1) 核心任務。核心任務是Ant自帶的任務。
(2) 可選任務。可選任務實來自第三方的任務,因此需要一個附加的JAR文件。
(3) 用戶自定義的任務。用戶自定義的任務實用戶自己開發的任務。
1、project標籤
每個構建文件對應一個項目。project標籤時構建文件的根標籤。它可以有多個內在屬性,就如代碼中所示,其各個屬性的含義分別如下。
(1) default表示默認的運行目標,這個屬性是必須的。
(2) basedir表示項目的基準目錄。
(3) name表示項目名。
(4) description表示項目的描述。
每個構建文件都對應於一個項目,但是大型項目經常包含大量的子項目,每一個子項目都可以有自己的構建文件。

2、target標籤
一個項目標籤下可以有一個或多個target標籤。一個target標籤可以依賴其他的target標籤。例如,有一個target用於編譯程序,另一個target用於聲稱可執行文件。在生成可執行文件之前必須先編譯該文件,因策可執行文件的target依賴於編譯程序的target。Target的所有屬性如下。
(1) name表示標明,這個屬性是必須的。
(2) depends表示依賴的目標。
(3) if表示僅當屬性設置時才執行。
(4) unless表示當屬性沒有設置時才執行。
(5) description表示項目的描述。
Ant的depends屬性指定了target的執行順序。Ant會依照depends屬性中target出現順序依次執行每個target。在執行之前,首先需要執行它所依賴的target。程序中的名爲run的target的depends屬性compile,而名爲compile的target的depends屬性是prepare,所以這幾個target執行的順序是prepare->compile->run。一個target只能被執行一次,即使有多個target依賴於它。如果沒有if或unless屬性,target總會被執行。

3、mkdir標籤
該標籤用於創建一個目錄,它有一個屬性dir用來指定所創建的目錄名,其代碼如下:<mkdir dir=”${class.root}”/>通過以上代碼就創建了一個目錄,這個目錄已經被前面的property標籤所指定。

4、jar標籤
該標籤用來生成一個JAR文件,其屬性如下。
(1) destfile表示JAR文件名。
(2) basedir表示被歸檔的文件名。
(3) includes表示別歸檔的文件模式。
(4) exchudes表示被排除的文件模式。

5、javac標籤
該標籤用於編譯一個或一組java文件,其屬性如下:
(1).srcdir表示源程序的目錄。
(2).destdir表示class文件的輸出目錄。
(3).include表示被編譯的文件的模式。
(4).excludes表示被排除的文件的模式。
(5).classpath表示所使用的類路徑。
(6).debug表示包含的調試信息。
(7).optimize表示是否使用優化。
(8).verbose 表示提供詳細的輸出信息。
(9).fileonerror表示當碰到錯誤就自動停止。

6、java標籤
該標籤用來執行編譯生成的.class文件,其屬性如下。
(1).classname 表示將執行的類名。
(2).jar表示包含該類的JAR文件名。
(3).classpath所表示用到的類路徑。
(4).fork表示在一個新的虛擬機中運行該類。
(5).failonerror表示當出現錯誤時自動停止。
(6).output 表示輸出文件。
(7).append表示追加或者覆蓋默認文件。

7、war標籤
該標籤用來把javaweb項目打包成一個war文件,在javaweb開發中經常用到,其屬性如下。
(1).destfile表示生成war文件路徑。
(2).webxml表示web項目的配置文件web.xml

8、delete標籤
該標籤用於刪除一個文件或一組文件,去屬性如下:
(1).file表示要刪除的文件。
(2).dir表示要刪除的目錄。
(3).includeEmptyDirs 表示指定是否要刪除空目錄,默認值是刪除。
(4).failonerror 表示指定當碰到錯誤是否停止,默認值是自動停止。
(5).verbose表示指定是否列出所刪除的文件,默認值爲不列出。

9、copy標籤
該標籤用於文件或文件集的拷貝,其屬性如下。
(1).file 表示源文件。
(2).tofile 表示目標文件。
(3).todir 表示目標目錄。
(4).overwrite 表示指定是否覆蓋目標文件,默認值是不覆蓋。
(5).includeEmptyDirs 表示制定是否拷貝空目錄,默認值爲拷貝。
(6).failonerror 表示指定如目標沒有發現是否自動停止,默認值是停止。
(7).verbose 表示制定是否顯示詳細信息,默認值不顯示。

以上是構建文件中的常用標籤,還有很多標籤,在此不一一介紹
在構建文件中爲了標識文件或文件組,經常需要使用數據類型,介紹幾種常用的數據類型。
1、fileset類型
Fileset 數據類型定義了一組文件,並通常表示爲fileset元素。不過,許多ant任務構建成了隱式的fileset,這說明他們支持所有的fileset屬性和嵌套元素。以下爲fileset 的屬性列表。
(1).dir表示fileset 的基目錄。
(2).casesensitive的值如果爲false,那麼匹配文件名時,fileset不是區分大小寫的,其默認值爲true。
(3).defaultexcludes 用來確定是否使用默認的排除模式,默認爲true。
(4).excludes 是用逗號分隔的需要派出的文件模式列表。
(5).excludesfile 表示每行包含一個排除模式的文件的文件名。
(6).includes 是用逗號分隔的,需要包含的文件模式列表。
(7).includesfile 表示每行包括一個包含模式的文件名。
例如:
<fileset dir="${lib.dir}">
<include name="**/*.jar"/>
</fileset>

2、argument 類型
由Ant構建文件調用的程序,可以通過arg元素向其傳遞命令行參數,如apply,exec和java任務均可接受嵌套arg元素,可以爲各自的過程調用指定參數。以下是arg的所有屬性。
(1).values 是一個命令參數。如果參數種有空格,但又想將它作爲單獨一個值,則使用此屬性。
(2).file表示一個參數的文件名。在構建文件中,此文件名相對於當前的工作目錄。
(3).line表示用空格分隔的多個參數列表。
(4).path表示路徑。

3、path類型
Path元素用來表示一個類路徑,不過它還可以用於表示其他的路徑。在用作揖個屬性時,路經中的各項用分號或冒號隔開。在構建的時候,此分隔符將代替當前平臺中所有的路徑分隔符,其擁有的屬性如下。
(1).location 表示一個文件或目錄。Ant在內部將此擴展爲一個絕對路徑。
(2).refid 是對當前構建文件中某處定義的一個path的引用。
(3).path表示一個文件或路徑名列表。
例如:

    <path id="classpath">
        <fileset dir="${lib.dir}">
            <include name="**/*.jar"/>
        </fileset>
    </path>

4、filterset 類型
Filterset定義了一組過濾器,這些過濾器將在文件移動或複製時完成文件的文本替換。
主要屬性如下:
(1).begintoken 表示嵌套過濾器所搜索的記號,這是標識其開始的字符串。
(2).endtoken表示嵌套過濾器所搜索的記號這是標識其結束的字符串。
(3).id是過濾器的唯一標誌符。
(4).refid是對構建文件中某處定義一個過濾器的引用。

5、ervironment 類型
由Ant構建文件調用的外部命令或程序,env元素制定了哪些環境變量要傳遞給正在執行的系統命令,env元素可以接受以下屬性。
(1).file表示環境變量值得文件名。此文件名要被轉換位一個絕對路徑。
(2).path表示環境變量的路徑。Ant會將它轉換爲一個本地約定。
(3).value 表示環境變量的一個直接變量。
(4).key 表示環境變量名。
注意 file path 或 value只能取一個。

提供一個我自己開發的構建文件demo:

<?xml version="1.0" encoding="UTF-8"?>
<project name="webclient" default="war" basedir=".">
    <property name="webapp.name" value="webclient"/>
    <property name="src.dir" value="${basedir}/src"/>
    <property name="lib.dir" value="${basedir}/WebContent/WEB-INF/lib"/>
    <property name="class.dir" value="${basedir}/WebContent/WEB-INF/classes"/>
    <property name="war.dir" value="${basedir}/war"/>
    <!-- set class path -->
    <path id="classpath">
        <fileset dir="${lib.dir}">
            <include name="**/*.jar"/>
        </fileset>
    </path>
    <!-- clean class & war -->
    <target name="clean">
        <delete dir="${class.dir}" includes="**/*.class"/>
        <delete dir="${war.dir}/${webapp.name}.war"/>
    </target>
    <!-- compile java -->
    <target name="compile" depends="clean">
        <mkdir dir="${class.dir}"/>
        <javac srcdir="${src.dir}" destdir="${class.dir}" debug="true" includeantruntime="false">
            <classpath refid="classpath"/>
        </javac>
        <copy todir="${class.dir}">
            <fileset dir="${src.dir}" excludes="**/*.java"/>
        </copy>
    </target>

    <target name="war" depends="compile">
        <mkdir dir="${war.dir}"/>
        <war destfile="${war.dir}/${webapp.name}.war" webxml="${basedir}/WebContent/WEB-INF/web.xml">
            <fileset dir="${basedir}/WebContent">
                <exclude name="**/*.java"/>
            </fileset>
            <!-- <lib dir="${lib.dir}"/> -->
            <!-- <classes dir="${class.dir}"/> -->
        </war>
    </target>
</project>

創建了build文件,就可以打包war、jar等文件了。具體操作:進入dos命令環境->cd命令進入build.xml文件所在目錄->執行命令ant -buildfile build.xml
出現如圖所示界面,說明war文件打包成功。
這裏寫圖片描述
這裏寫圖片描述

細心的讀者可能會發現我的命令行中並沒有調用“ant”命令,而是運行了一個叫build.bat的批量處理文件,並且我的ant路徑也是以參數傳遞的。不錯,我在ant.bat文件外層自定義了一個build.bat文件,在文件中調用ant命令執行打包操作。這樣做是有好處的,下面先給出build.bat文件,再說明這樣做的優勢。

@echo off
set JAVA_HOME=C:\Program Files (x86)\Java\jdk1.7.0_17
set CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
set work_dir=%~dp0%
rem set /p ANT_PATH=please input ant path:
set ANT_PATH=%1
pushd %work_dir%
%ANT_PATH%/ant -buildfile build.xml
popd

可以看到,在文件開頭我定義了兩個宏,指明jdk的配置信息。這樣一來,用戶就不需要再配置jdk的環境變量了。假如你的電腦裏安裝了兩個版本的jdk,只需要修改腳本文件就可以輕鬆地在兩個版本jdk中運行。另外,以參數的形式傳入Ant的路徑,也省去了配置Ant的環境變量,這樣既方便後續開發者調用你的腳本文件,又能輕鬆的在其他pc上運行。
最後提一下dos下的傳參命令,%0代表當前路徑,%1接收傳入的第一個參數,%2接收傳入的第二個參數……以此類推。%~dp0%和%0類似,代表當前路徑,但是與%0不同的是,%~dp0%可以獲取輸入路徑的父目錄,例輸入D:\codes\trunk\client\web\IBMS\webclient\build.bat,則%~dp0%=D:\codes\trunk\client\web\IBMS\webclient
好了,以上是這次研究的所有內容了,比較淺顯,有待深入研究!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章