1. 程式人生 > >ant用途及簡單實現

ant用途及簡單實現

Ant工具的作用:  1、可以用ant編譯java類,生成class檔案  2、ant可以自定義標籤、配置檔案  3、ant可以把相關層架構成包  4、ant把整個專案生成web包,併發布到Tomcat

也許你聽到別人說起ant,一時衝動準備學習一下ant,當你看完了上邊的第一個例項,也許你感覺ant真好,也許你感覺ant不過如此,得出這些結論都 不能說錯,雖然ant很好用,但並不是在任何情況下都是最好的選擇,例如windows上有更多更簡單,更容易使用的工具,比如 eclipse+myeclipse eclipse+wtp等等,無論是編譯,部署,執行使用起來比ant更容易,方便但有些情況則是ant發揮的好地方: 1,伺服器上部署的時候 當你的程式開發完成,部署人員要部署在伺服器上的時候,總不能因為因為安裝一個程式就配置一個eclipse+myeclipse吧,ant在這個時候是 個很好的選擇,因為它小巧,容易配置,你帶著你寫好的build.xml到任何一臺伺服器上,只需要做簡單的修改(一些設定,例如目錄),然後一兩個命令 完成,這難道不是一件美好的事情嗎。 2,linux上,很多時候是這樣的,程式開發是在windows下,但是程式要在linux或者unix上執行,在linux或者 在unix(特別是unix上)部署是個麻煩的事情,這個時候ant的特點又出來了,因為ant是跨平臺的,你在build.xml可以在大多數作業系統 上使用,基本不需要修改。 3,當伺服器維護者不懂程式設計的時候 很多人都有過這樣的經歷,使用你們程式的人,並不懂得寫程式。你得程式因為版本更新,因為修正bug需要一次又一次得重新部署。這個時候你會發現教一個人 是如此得困難。但是有ant後,你只需要告訴他,輸入ant xxx等一兩個命令,一切ok.

以上是我遇到得一些情況。 看完以上得情況,好好考慮一下,你是否需要使用ant。

-------------------------------------------------ant簡單教程-------------------------------------------------

一、ant關鍵元素 1. project元素     project 元素是 Ant 構件檔案的根元素, Ant 構件檔案至少應該包含一個 project 元素,否則會發生錯誤。在每個 project 元素下,可包含多個 target 元素。接下來向讀者展示一下 project 元素的各屬性。

1) name 屬性

    用於指定 project 元素的名稱。

2) default 屬性

    用於指定 project 預設執行時所執行的 target 的名稱。

3) basedir 屬性

    用於指定基路徑的位置。該屬性沒有指定時,使用 Ant 的構件檔案的附目錄作為基準目錄。

<?xml version="1.0" ?> <project name ="antPro" default ="getBaseDir" basedir ="C:/ThinkInJavaCode">         <target  name="getBaseDir">                <echo message="The base dir is: ${basedir}"/>         </target> </project>

    從上例可以看出,在這裡定義了default 屬性的值為getBaseDir ,即當執行ant 命令時,如果沒有指明待執行的target,則將執行預設的target--getBaseDir 。此外,還定義了basedir 屬性的值為 "C:/ThinkInJavaCode" ,進入"C:/ThinkInJavaCode" 後執行ant 命令,得一下結果:

Buildfile: C:\ThinkInJavaCode\build.xml   sayBaseDir:      [echo] The base dir is: C:\ThinkInJavaCode   BUILD SUCCESSFUL Total time: 0 seconds

2. target 元素    target為Ant的基本執行單元,它可以包含一個或多個具體的任務。多個target 可以存在相互依賴關係。它有如下屬性:

1) name 屬性

    指定 target 元素的名稱,這個屬性在一個 project 元素中是唯一的。我們可以通過指定 target 元素的名稱來指定某個 target 。

2) depends 屬性

    用於描述 target 之間的依賴關係,若與多個 target 存在依賴關係時,需要以“,”間隔。 Ant 會依照 depends 屬性中 target 出現的順序依次執行每個 target 。被依賴的 target 會先執行。

3) if 屬性

    用於驗證指定的屬性是否存在,若不存在,所在 target 將不會被執行。

4) unless 屬性

    該屬性的功能與 if 屬性的功能正好相反,它也用於驗證指定的屬性是否存在,若不存在,所在 target 將會被執行。

5) description 屬性

    該屬性是關於 target 功能的簡短描述和說明。

    舉例說明如下:

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

    從以下結果後可以看到,我們執行的是名為 targetB 的target ,由於它依賴於targetA ,所以 targetA 將首先被執行,同時因為系統配置了JDK,所以 ant.java.version 屬性存在,執行了targetA,輸出資訊:"[echo] Java Version: 1.6 ",targetA 執行完畢後,接著執行 targetB ,因為philander不存在,而unless屬性是在不存在時進入所在target 的,由此可知 targetB 得以執行,輸出資訊:"[echo] The base dir is: C:\ThinkInJavaCode"。

Buildfile: C:\ThinkInJavaCode\build.xml   targetA:      [echo] Java Version: 1.6   targetB:      [echo] The base dir is: C:\ThinkInJavaCode   BUILD SUCCESSFUL Total time: 0 seconds

3. property 元素      property元素可看作參量或者引數的定義,project 的屬性可以通過 property 元素來設定,也可在 Ant 之外設定。若要在外部引入某檔案,例如 build.properties 檔案,可以通過如下內容將其引入:

1 <property file=” build.properties”/>

property 元素可用作 task 的屬性值。在 task 中是通過將屬性名放在“ ${ ”和“ } ”之間,並放在 task 屬性值的位置來實現的。

    Ant 提供了一些內建的屬性,它能得到的系統屬性的列表與 Java 文件中 System.getPropertis() 方法得到的屬性一致,這些系統屬性可參考 sun 網站的說明。同時, Ant 還提供了一些它自己的內建屬性,如下:

    basedir:project 基目錄的絕對路徑;   

    ant.file:buildfile的絕對路徑,上例中ant.file值為C:\ThinkInJavaCode\build.xml;

    ant.version:Ant 的版本資訊,本文為1.8.1 ;

    ant.project.name:當前指定的project的名字,即前文說到的project的name屬性值; 

    ant.java.version:Ant 檢測到的JDK版本,本文為 1.6 。

    舉例說明如下:

<? xml version="1.0" ?> <project  name ="propertyPro"  default ="example">     <property  name ="name"  value ="philander"/>     <property  name ="age"  value ="25"/>     <target  name ="example">          <echo  message ="name: ${name}, age: ${age}"/>     </target> </project>

    上例中使用者設定了名為name 和age的兩個屬性,這兩個屬性設定後,在下文中可以通過 ${name} 和 ${age} 分別取得這兩個屬性值。

二、ANT常用命令 1. copy 命令     copy主要用來對檔案和目錄的複製功能。舉例如下:

eg1. 複製單個檔案:

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

eg2. 對檔案目錄進行復制:

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

eg3. 將檔案複製到另外的目錄:

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

2. delete 命令     對檔案或目錄進行刪除,舉例如下:

eg1. 刪除某個檔案:

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

eg2. 刪除某個目錄:

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

eg3. 刪除所有的備份目錄或空目錄:

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

3. mkdir 命令     建立目錄。 eg :

1 <mkdir dir="/home/philander/build/classes"/>

4. move 命令     移動檔案或目錄,舉例如下:

eg1. 移動單個檔案:

1 <move file="sourcefile" tofile=”destfile”/>

eg2. 移動單個檔案到另一個目錄:

1 <move file="sourcefile" todir=”movedir”/>

eg3. 移動某個目錄到另一個目錄:

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

5. echo 命令     該任務的作用是根據日誌或監控器的級別輸出資訊。它包括 message 、 file 、 append 和 level 四個屬性,舉例如下

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

三、利用ant 構建和部署Java專案     Ant 可以代替使用 javac 、 java 和 jar 等命令來執行 java 操作,從而達到輕鬆的構建和部署 Java 專案的目的。

1. 利用ant 的javac命令來編譯Java程式     Ant 的javac命令用於實現編譯Java 程式的功能。下面來看一個簡單的例子:首先我們建立名為 JavaTestPro的Java專案,建立src目錄為原始碼目錄,在src目錄下建立HelloWorld.java這個類檔案。該類檔案的內容如下:

public class HelloWorld {      public static void main(String[] args) {     System.out.println("hello world!");      } }

    同時在JavaTestPro專案的根目錄下建立build.xml 檔案,在該檔案中編譯sr 目錄下的Java檔案,並將編譯後的class檔案放入build/classes 目錄中,整個專案的目錄結構如下:

|JavaTestPro       |src       |build             |classes       |build.xml

     在編譯前,需清除classes 目錄,該檔案的內容如下:

 <?xml version="1.0" ?>   <project name ="javacTest" default="compile" basedir=".">     <target name="clean">         <delete dir="${basedir}/build"/>     </target>     <target name="compile"  depends ="clean">         <mkdir dir ="${basedir}/build/classes"/>         <javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/>     </target> </project>

    在專案根目錄(C:\ThinkInJavaCode\JavaTestPro)執行ant命令後,可在該目錄下發現新生成的build/classes子目錄,編譯後生成的HelloWorld.class檔案就在該目錄下。

2. 使用java命令執行Java程式      Ant 中可以使用 java命令實現執行Java程式的功能。可以在上面的build.xml基礎上做修改來實現:

<?xml version="1.0" ?> <project name ="javacTest" default="run" basedir=".">     <target name="clean">         <delete dir="${basedir}/build"/>     </target>     <target name="compile"  depends ="clean">         <mkdir dir ="${basedir}/build/classes"/>         <javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/>     </target>      <target name="run"  depends ="compile">         <java classname ="HelloWorld">             <classpath>                <pathelement path="${basedir}/build/classes"/>             </classpath>         </java>     </target> </project>

接著,就可以在控制檯看見輸出:"[java] hello world!"

3. 使用jar命令生成jar檔案      還可以在上例的基礎上更進一步,來生成jar包,可在run 這個 target 下再加上如下 target :

<?xml version="1.0" ?> <project name ="javacTest" default="jar" basedir=".">     <target name="clean">         <delete dir="${basedir}/build"/>     </target>     <target name="compile"  depends ="clean">         <mkdir dir ="${basedir}/build/classes"/>         <javac srcdir ="${basedir}/src" destdir ="${basedir}/build/classes"/>     </target>     <target name="run"  depends="compile">           <java classname ="HelloWorld">       <classpath>                     <pathelement path="${basedir}/build/classes"/>                  </classpath>            </java>     </target>     <target name="jar" depends="run">            <jar destfile="helloworld.jar" basedir="${basedir}/build/classes">                 <manifest>           <attribute name="Main-class" value="HelloWorld"/>                 </manifest>             </jar>     </target > </project>

    其中,project的default 屬性設定為應設為jar,ant執行完畢後,可看到在專案的根目錄下生成了一個 helloworld.jar的jar包 。可通過執行以下命令來執行該jar包:

1 java -jar helloworld.jar

4. 使用war命令打包JavaEE專案      建立一個JavaEE專案,其中src 為Java原始碼目錄,WebContent為各jsp存放目錄,lib 為專案引用的的包的目錄。在WebTest專案目錄下建立了build.xml 檔案,該檔案為該工程的 Ant 構件檔案。

|WebContent     |src     |build         |classes     |WebContent         |META-INF             |MANIFEST.MF         |WEB-INF             |lib             |classes         |HelloJSP.jsp     |build.xml

    讀者可以 src 目錄下放入在前續例子中開發的 HelloWorld.java 檔案,並在 WebContent下建立 HelloJSP.jsp 檔案,其內容很簡單,就是輸出 Hello 資訊,程式碼如下所示:

<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>war test for ant</title> </head> <body>       Hello JSP!Hello Ant! </body> </html>

    接下來編寫 build.xml 檔案,其內容如下:

<?xml version="1.0" encoding="UTF-8" ?> <project name ="WebTest" default ="war" basedir =".">     <property  name ="classes" value ="${basedir}/build/classes"/>     <property  name ="build" value ="${basedir}/build"/>     <property  name ="lib" value ="${basedir}/WebContent/WEB-INF/lib"/>      <!--  刪除build 路徑-->     <target  name ="clean">         <delete dir ="${build}"/>     </target>        <!--  建立build/classes 路徑,並編譯class 檔案到build/classes 路徑下-->      <target name ="compile"  depends ="clean">         <mkdir dir ="${classes}"/>         <javac srcdir ="${basedir}/src"  destdir ="${classes}"/>      </target>        <!--  打war 包-->      <target name ="war" depends ="compile">             <war destfile ="${build}/WebTest.war"  webxml ="${basedir}/WebContent/WEB-INF/web.xml">             <!--  拷貝WebRoot 下除了WEB-INF 和META-INF 的兩個資料夾-->              <fileset dir ="${basedir}/WebContent"  includes ="**/*.jsp"/>             <!--  拷貝lib 目錄下的jar 包-->             <lib dir ="${lib}"/>             <!--  拷貝build/classes 下的class 檔案-->             <classes dir ="${classes}"/>         </war>      </target> </project>

     在C:\ThinkInJavaCode\WebTest目錄下執行ant後,就生成了WebTest.war 檔案了,然後可以將其放入Web容器(如Tomcat)的相應目錄下(${Tomcata安裝目錄}\webapps)執行該web專案了。

執行build.xml檔案:cmd進入檔案所在目錄執行命令:ant -file build.xml。