ANT簡明教程

1、ant關鍵元素

1. project元素

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

1) name 屬性 java

    用於指定 project 元素的名稱。 web

2) default 屬性 app

    用於指定 project 默認執行時所執行的 target 的名稱。 less

3) basedir 屬性 webapp

    用於指定基路徑的位置。該屬性沒有指定時,使用 Ant 的構件文件的附目錄做爲基準目錄。 jsp

<?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 能夠存在相互依賴關係。它有以下屬性: ui

1) name 屬性 spa

    指定 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 文件,能夠經過以下內容將其引入:

<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} 分別取得這兩個屬性值。

2、ANT經常使用命令

1. copy 命令

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

eg1. 複製單個文件:

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

eg2. 對文件目錄進行復制:

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

eg3. 將文件複製到另外的目錄:

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

2. delete 命令

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

eg1. 刪除某個文件:

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

eg2. 刪除某個目錄:

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

eg3. 刪除全部的備份目錄或空目錄:

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

3. mkdir 命令

    建立目錄。 eg :

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

4. move 命令

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

eg1. 移動單個文件:

<move file="sourcefile" tofile=」destfile」/>

eg2. 移動單個文件到另外一個目錄:

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

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

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

5echo 命令

    該任務的做用是根據日誌或監控器的級別輸出信息。它包括 message 、 file 、 append 和 level 四個屬性,舉例以下

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

3、利用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包:

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項目了。

相關文章
相關標籤/搜索