Ant

1.ANT簡介

爲何你須要一個構建工具?

理解Apache Ant定義以前,必須瞭解須要一個構建工具。爲何我須要Ant,或者更具體地說,爲何我須要一個構建工具?html

花你一天作如下工做?java

  • 編譯代碼web

  • 打包二進制文件spring

  • 部署二進制文件到測試服務器數據庫

  • 測試您的代碼更改apache

  • 從一個位置複製代碼到另外一個地方編程

若是你回答是確定的上述任何一項,那麼如今是時候實現過程的自動化。tomcat

平均而言,開發人員花費3小時(工做日超出 8小時)作這樣構建和部署平凡的任務。難道你會很高興多要回3個小時?服務器

Apache Ant是能夠在命令行中執行一個操做系統構建和部署工具。架構

 

2.ANT簡介

爲何你須要一個構建工具?

理解Apache Ant定義以前,必須瞭解須要一個構建工具。爲何我須要Ant,或者更具體地說,爲何我須要一個構建工具?

花你一天作如下工做?

  • 編譯代碼

  • 打包二進制文件

  • 部署二進制文件到測試服務器

  • 測試您的代碼更改

  • 從一個位置複製代碼到另外一個地方

若是你回答是確定的上述任何一項,那麼如今是時候實現過程的自動化。

平均而言,開發人員花費3小時(工做日超出 8小時)作這樣構建和部署平凡的任務。難道你會很高興多要回3個小時?

Apache Ant是能夠在命令行中執行一個操做系統構建和部署工具。

Apache Ant的歷史

  • Ant 表明着另外一種簡潔的工具

  • Ant 是由詹姆斯·鄧肯·戴維森(Tomcat的原做者)建立的,在他歐洲飛往美國時。

  • Ant 最初是用來構建Tomcat,被捆綁Tomcat做爲分發的一部分

  • Ant 誕生製造工具出有關的問題和複雜性

  • Ant 於2000年晉升爲在Apache的一個獨立項目。

  • Apache Ant(截至2011年7月)的當前版本是1.8.2

  • NAnt 是.NET構建工具,它相似於Ant,但用於構建.NET應用程序

Apache Ant功能

  • Ant 是最完整的Java構建和部署工具。

  • Ant是平臺無關的,能夠處理特定平臺的屬性,如文件分隔符。

  • Ant 能夠用於執行特定任務的平臺,例如使用「觸摸'命令修改文件的修改時間。

  • Ant 腳本使用的是純XML編寫的。若是你已經熟悉XML,你能夠學習Ant 很快。

  • Ant擅長複雜的自動化重複的任務。

  • Ant 自帶的預約義任務的大名單。

  • Ant提供了開發自定義任務的界面。

  • Ant能夠在命令行中很容易地調用,它能夠與免費的和商業的IDE集成。

 

3.ANT環境安裝設置

安裝Apache Ant

假定您已經下載並安裝Java開發工具包(JDK)在您的電腦上。若是沒有,請按照這裏的說明。

Apache Ant是Apache軟件許可證,由開放源碼倡議認證一個徹底成熟的開源許可下發布。

最新的Apache Ant版本,包括完整的源代碼,類文件和文檔能夠在這裏找到 http://ant.apache.org.

  • 確保將JAVA_HOME環境變量設置到安裝JDK的文件夾。

  • 下載的二進制文件從http://ant.apache.org

  • 使用Winzip,WinRAR,7-zip或相似工具解壓縮zip文件到一個方便的位置 c:folder.

  • 建立一個名爲ANT_HOME,一個新的環境變量指向Ant的安裝文件夾,在 c:apache-ant-1.8.2-bin 文件夾。

  • 附加的路徑Apache Ant批處理文件添加到PATH環境變量中。在咱們的例子是 c:apache-ant-1.8.2-binin文件夾。

驗證Apache Ant的安裝

要驗證Apache Ant已成功安裝在您的計算機上,打開一個命令提示符,而後輸入ant。

你應該會看到相似的輸出:

C:>ant -version
Apache Ant(TM) version 1.8.2 compiled on December 20 2010

若是您看不到上面的,那麼請確認您已遵循安裝步驟正確。

 

ant版本與jdk版本匹配,不然出現找不到ant等問題,如jdk1.7與ant1.7匹配,jdk1.7與ant1.9以上不匹配

 本文基於jdk1.7與ant1.7

 

安裝 Eclipse

本教程還包括集成Ant 到 Eclipse IDE中。因此,若是你尚未安裝Eclipse,請下載並安裝Eclipse

想要Eclipse:

  • 從下載最新的Eclipse二進制文件 www.eclipse.org

  • 解壓Eclipse的二進制文件到一個方便的位置如 c:

  • 運行 c:eclipseeclipse.exe

 

4.Ant構建文件

一般狀況下,Ant構建文件build.xml應該在項目的基礎目錄。能夠自由使用其餘文件名或將構建文件中其餘位置。

在本練習中,建立一個名爲build.xml 在電腦的任何地方的文件。

<?xml version="1.0"?>
   <project name="Hello World Project" default="info">
   <target name="info">
      <echo>Hello World - Welcome to Apache Ant!</echo>
   </target>
</project>

請注意,應該有XML聲明以前沒有空行或空格。該處理指令目標匹配"[xX][mM][lL]" 是不容許的 - 若是你這樣作,這可能在運行Ant構建時形成的錯誤消息。

全部構建文件要求項目元素和至少一個目標元素。

XML元素的項目有三個屬性:

屬性 描述
name The Name of the project. (Optional)
default The default target for the build script. A project may contain any number of targets. This attribute specifies which target should be considered as the default. (Mandatory)
basedir The base directory (or) the root folder for the project. (Optional)

一個目標是要做爲一個單元運行的任務的集合。在咱們的例子中,咱們有一個簡單的目標,以提供一個信息性消息給用戶。

目標能夠對其餘目標的依賴關係。例如,部署目標可能對封裝對象的依賴和包的目標可能具備依賴於compile目標等等。依賴關係是使用依賴屬性表示。例如:

<target name="deploy" depends="pacakge">
  ....
</target>
<target name="pacakge" depends="clean,compile">
  ....
</target>
<target name="clean" >
  ....
</target>
<target name="compile" >
  ....
</target>

目標元素具備如下屬性:

屬性 描述
name The name of the target (Required)
depends Comma separated list of all targets that this target depends on. (Optional)
description A short description of the target. (optional)
if Allows the execution of a target based on the trueness of a conditional attribute. (optional)
unless Adds the target to the dependency list of the specified Extension Point. An Extension Point is similar to a target, but it does not have any tasks. (Optional)

在上面的例子中的echo 任務是打印一條消息一個簡單的任務。在咱們的例子,它打印出Hello World消息。

要運行Ant構建文件,打開命令提示符並導航到build.xml文件所在的文件夾,而後輸入ant info。也能夠只輸入ant來代替。既會工做,由於信息是默認的目標在構建文件。應該看到下面的輸出:

 C:>ant
Buildfile: C:uild.xml

info:
     [echo] Hello World - Welcome to Apache Ant!

BUILD SUCCESSFUL
Total time: 0 seconds

C:>

5.Ant屬性任務

Ant構建文件是用XML編寫的,它不迎合聲明變量,你在最喜歡的編程語言作的。然而,正如你可能已經想到,它會若是容許Ant聲明變量,如項目名稱,項目源代碼目錄等有用

Ant使用屬性元素,它容許你指定的屬性。這容許屬性從一個版本改變爲另外一個。或者從一個環境到另外一個。

默認狀況下,Ant提供了能夠在構建文件中使用下列預約義的屬性

屬性 描述
ant.file The full location of the build file.
ant.version The version of the Apache Ant installation.
basedir The basedir of the build, as specified in the basedir attribute of theproject element.
ant.java.version The version of the JDK that is used by Ant.
ant.project.name The name of the project, as specified in the name atrribute of theproject element
ant.project.default-target The default target of the current project
ant.project.invoked-targets Comma separated list of the targets that were invoked in the current project
ant.core.lib The full location of the ant jar file
ant.home The home directory of Ant installation
ant.library.dir The home directory for Ant library files - typically ANT_HOME/lib folder.

Ant也使得系統性能(例如:文件分割符),可用於構建文件。

除了以上所述,用戶可使用屬性元素定義附加屬性。一個例子介紹以下展現瞭如何定義一個名爲站點名稱(sitename)屬性:

<?xml version="1.0"?>
<project name="Hello World Project" default="info">
 <property name="sitename" value="www.yiibai.com"/>
   <target name="info">
      <echo>Apache Ant version is ${ant.version} - You are 
      at ${sitename} </echo>
   </target>
</project>

上述構建文件運行ant應該產生下面的輸出:

C:>ant
Buildfile: C:uild.xml

info:
     [echo] Apache Ant version is Apache Ant(TM) version 1.8.2 
     compiled on December 20 2010 - You are at www.yiibai.com

BUILD SUCCESSFUL
Total time: 0 seconds
C:>

 

6.Ant屬性文件

直接在構建文件中設置屬性是好的,若是你使用的是少數屬性。然而,對於一個大型項目,是要存儲在一個單獨的屬性文件中。

存儲在一個單獨的文件中的屬性可讓你重複使用相同的編譯文件,針對不一樣的執行環境不一樣的屬性設置。例如,生成屬性文件能夠單獨維持DEV,TEST和PROD環境。

指定在一個單獨的文件屬性是有用的,當你不知道一個屬性(在一個特定的環境中)前面的值。這使您能夠在屬性值是已知的其餘環境進行構建。

沒有硬性規定,但通常屬性文件名爲build.properties文件,並放在沿一側的build.xml文件。如build.properties.dev和build.properties.test - 你能夠根據部署環境中建立多個生成屬性文件

構建屬性文件的內容相似於普通的Java屬性文件。他們每行包含一個屬性。每一個屬性由一個名稱和一個值對來表示。名稱和值對由等號分開。強烈建議屬性標註了正確的註釋。註釋列出所使用的哈希字符。

下面顯示了一個build.xml文件和相關build.properties文件

build.xml

<?xml version="1.0"?>
<project name="Hello World Project" default="info">
   <property file="build.properties"/>
      <target name="info">
         <echo>Apache Ant version is ${ant.version} - You are 
         at ${sitename} </echo>
     </target>
</project>

 

build.properties

# The Site Name
sitename=www.yiibai.com
buildversion=3.3.2
在上面的例子中,站點名是被映射到該站點的名稱自定義屬性,能夠聲明任意數目以這種方式自定義屬性。在上面的例子中所列的另外一個自定義屬性是buildversion,其中,在這種狀況下指的是建立的版本。
 
除上述者外,Ant附帶了一些預約義的構建屬性,它已被列入上一節中,但下面是表明一次。
屬性 描述
ant.file The full location of the build file
ant.version The version of the Apache Ant installation
basedir The basedir of the build, as specified in the basedir attribute of theproject element.
ant.java.version The version of the JDK that is used by Ant.
ant.project.name The name of the project, as specified in the name atrribute of theproject element.
ant.project.default-target The default target of the current project
ant.project.invoked-targets Comma separated list of the targets that were invoked in the current project
ant.core.lib The full location of the ant jar file
ant.home The home directory of Ant installation
ant.library.dir The home directory for Ant library files - typically ANT_HOME/lib folder.

在本節的例子中,咱們使用內置的屬性ant.version。

<?xml version="1.0"?>
<project name="Hello World Project" default="info">
   <target name="info">
       <echo>${ant.file}</echo>
       <echo>${ant.version}</echo>
       <echo>${basedir}</echo>
       <echo>${ant.java.version}</echo>
       <echo>${ant.project.name}</echo>
       <echo>${ant.project.default-target}</echo>
       <echo>${ant.project.invoked-targets}</echo>
       <echo>${ant.core.lib}</echo>
       <echo>${ant.home}</echo>
       <echo>${ant.library.dir}</echo>
   </target>
</project>

 

Buildfile: E:\sctfBank\cgnb\branches\2000_dev\2100_projects\v1.6\nc_web_admin\build\build.xml
info:
     [echo] E:\sctfBank\cgnb\branches\2000_dev\2100_projects\v1.6\nc_web_admin\build\build.xml
     [echo] Apache Ant version 1.7.1 compiled on June 27 2008
     [echo] E:\sctfBank\cgnb\branches\2000_dev\2100_projects\v1.6\nc_web_admin\build
     [echo] 1.6
     [echo] Hello World Project
     [echo] ${ant.project.default-target}
     [echo] ${ant.project.invoked-targets}
     [echo] E:\lqy\ant\apache-ant-1.7.1\lib\ant.jar
     [echo] E:\lqy\ant\apache-ant-1.7.1
     [echo] E:\lqy\ant\apache-ant-1.7.1\lib
BUILD SUCCESSFUL
Total time: 143 milliseconds

 

 

 

 

7.Ant數據類型

Ant提供了一些預約義的數據類型。不要混淆,也可在編程語言中的數據類型,而是考慮數據類型的設置被內置到產品中服務。

下面是一個由Apache Ant的提供的數據類型的列表

文件集合

該文件集的數據類型表示文件的集合。該文件集的數據類型一般是做爲一個過濾器,以包括和排除匹配特定模式的文件。

例如:

<fileset dir="${src}" casesensitive="yes">
  <include name="**/*.java"/>
  <exclude name="**/*Stub*"/>
</fileset>

在上面的例子中的src屬性指向項目的源文件夾。

在上面的例子中,文件集的選擇,除了那些包含在其中單詞「Stub」源文件夾中的全部java文件。在大小寫敏感的過濾器應用到文件集這意味着名爲Samplestub.java一個文件不會被排除在文件集

模式集

一個模式集是一個模式,能夠很是方便地篩選基於某種模式的文件或文件夾。可使用下面的元字符來建立模式。

  • ? - 只匹配一個字符
  • * - 匹配零個或多個字符
  • ** - 匹配零個或多個目錄遞歸

下面的例子應該給一個模式集的用法的想法。

<patternset id="java.files.without.stubs">
  <include name="src/**/*.java"/>
  <exclude name="src/**/*Stub*"/>
</patternset>

patternset 能夠用一個文件集重用以下:

<fileset dir="${src}" casesensitive="yes">
  <patternset refid="java.files.without.stubs"/>
 </fileset>

文件列表

在文件列表的數據類型相似設置,除了在文件列表中包含顯式命名的文件列表,不支持通配符的文件

文件列表和文件組的數據類型之間的另外一個主要區別是,在文件列表的數據類型可應用於可能會或可能還不存在的文件。

如下是文件列表的數據類型的一個例子

<filelist id="config.files" dir="${webapp.src.folder}">
  <file name="applicationConfig.xml"/>
  <file name="faces-config.xml"/>
  <file name="web.xml"/>
  <file name="portlet.xml"/>
</filelist>

在上面的例子中webapp.src.folder屬性指向該項目的Web應用程序的源文件夾。

過濾器集

使用與複製任務篩選器集的數據類型,你能夠匹配一個替代值的模式,全部的文件替換必定的文本。

一個常見的例子是附加版本號的發行說明文件,以下面的示例所示

<copy todir="${output.dir}">
  <fileset dir="${releasenotes.dir}" includes="**/*.txt"/>
  <filterset>
    <filter token="VERSION" value="${current.version}"/>
  </filterset>
</copy>

在上面的例子中output.dir屬性指向項目的輸出文件夾。

在上面的例子點releasenotes.dir屬性的發行說明的項目文件夾中。

在上面的例子中current.version屬性指向的項目的當前版本中的文件夾。

副本任務,顧名思義是用來從一個位置複製到另外一個文件。

路徑

path 數據類型一般用來表明一個類路徑。在路徑項用分號或冒號隔開。然而,這些字符會被正在運行的系統的路徑分隔符替換一個運行時間。

最多見的類路徑設置爲項目中的jar文件和類的列表,以下面的例子:

<path id="build.classpath.jar">
  <pathelement path="${env.J2EE_HOME}/${j2ee.jar}"/>
  <fileset dir="lib">
      <include name="**/*.jar"/>
  </fileset>
</path>

在上面的例子中env.J2EE_HOME屬性指向環境變量J2EE_HOME。

在上面的例子中的j2ee.jar屬性指向在J2EE基礎文件夾J2EE的jar文件的名稱。

 

8.Ant構建項目

如今,咱們已經瞭解了Ant數據類型,如今是時候把這些轉化爲行動。考慮下面的項目結構

項目將造成的Hello World傳真應用程序項目在本教程的其他部分。

解釋一下項目結構。

  • 數據庫腳本存儲在 db 文件夾。
  • Java源代碼存儲在src文件夾。
    • 圖像,JS,META-INF,樣式(CSS)被存儲在 WebRoot文件夾。
  • JSP被保存在jsp中文件夾。
  • 第三方jar文件都存儲在lib文件夾。
  • Java類文件將被存儲在WEB-INF classes文件夾。

這個練習的目的是創建一個編譯的java類,並將它們放置在WEB-INF classes文件夾Ant文件。

下面是項目所需的build.xml文件。讓咱們看看它內容:

 

 

 

build.xml文件:

<?xml version="1.0"?>
<project name="fax" basedir="." default="build">
    <property name="src.dir" value="src"/>
    <property name="web.dir" value="WebRoot"/>
    <property name="build.dir" value="${web.dir}/WEB-INF/classes"/>
    <property name="name" value="fax"/>

    <path id="master-classpath">
        <fileset dir="${web.dir}/WEB-INF/lib">
            <include name="*.jar"/>
        </fileset>
        <pathelement path="${build.dir}"/>
    </path>

    <target name="build" description="Compile source tree java files">
        <mkdir dir="${build.dir}"/>
        <javac destdir="${build.dir}" source="1.5" target="1.5">
            <src path="${src.dir}"/>
            <classpath refid="master-classpath"/>
        </javac>
    </target>
 
    <target name="clean" description="Clean output directories">
        <delete>
            <fileset dir="${build.dir}">
                <include name="**/*.class"/>
            </fileset>
        </delete>
    </target>

</project>

 

開始

運行 build,結果

 

多了classes文件夾

文件夾裏面編譯生成了class

 

運行clean能夠清楚class

 

解釋

首先,讓咱們爲源,聲明某些屬性,並創建文件夾。

<property name="src.dir" value="src"/>
<property name="web.dir" value="WebRoot"/>
<property name="build.dir" value="${web.dir}/WEB-INF/classes"/>

在這個例子中,對於src.dir是指項目(即,這裏的java源文件能夠找到)的源文件夾。

web.dir 指的是項目的網頁源文件夾。在這裏,您能夠找到JSP,web.xml,CSS,JavaScript和其餘Web相關的文件

最後,build.dir是指在項目編譯的輸出文件夾。

屬性能夠參考其餘屬性。如圖所示,在上述例子中,build.dir屬性使得參考web.dir屬性。

在這個例子中,對於src.dir是指項目的源的文件夾。

咱們的項目的默認目標compile目標。但首先,讓咱們看看clean目標。

clean目標,顧名思義刪除build文件夾中的文件。

<target name="clean" description="Clean output directories">
   <delete>
      <fileset dir="${build.dir}">
         <include name="**/*.class"/>
      </fileset>
   </delete>
</target>

在主類路徑保存在類路徑的信息。在這種狀況下,它包含在build文件夾中的類和在lib文件夾中的jar文件。

<path id="master-classpath">
   <fileset dir="${web.dir}/WEB-INF/lib">
      <include name="*.jar"/>
   </fileset>
   <pathelement path="${build.dir}"/>
</path>

最後,構建目標構建文件。首先,咱們建立構建目錄,若是它不存在。而後咱們執行javac命令(指定JDK1.5做爲咱們的目標編譯)。咱們提供的源文件夾和類路徑javac任務,並要求它砸在build文件夾中的類文件。

<target name="build" description="Compile main source tree java files">
   <mkdir dir="${build.dir}"/>
   <javac destdir="${build.dir}" source="1.5" target="1.5" debug="true"
             deprecation="false" optimize="false" failonerror="true">
      <src path="${src.dir}"/>
      <classpath refid="master-classpath"/>
   </javac>
</target>

在這個文件運行ant將編譯java源文件,並將類build文件夾中。該文件被編譯並放置在build.dir文件夾中。

 

9.Ant構建文檔

文檔是一個爲任何項目所必須的。文檔在項目的維護起到了極大的做用。經過使用內置的javadoc工具的Java使得文檔更容易。Ant使得它甚至產生對需求文檔更容易。

如你所知,javadoc工具具備高度的靈活性,並容許一些配置選項。Ant經過Javadoc任務公開這些配置選項。若是您不熟悉javadoc,建議在開始使用此Java文檔教程

如下部分列出了使用的Ant最經常使用的Javadoc選項。

屬性

源可使用源路徑,sourcepathref或將源文件的規定。源路徑是用來指向源文件(如src文件夾)的文件夾。 Sourcepathref用於參考,是由路徑屬性(例如,delegates.src.dir)引用的路徑。而當你要指定的單個文件以逗號分隔的列表時 的源文件使用。

使用destdir文件夾(例如build.dir)指定的目標路徑

你能夠由指定要包含在包名過濾Javadoc任務。這是經過使用packagenames屬性來實現,用逗號分隔的包文件列表。

你能夠過濾javadoc的過程當中,只顯示了公共,私有,包裝或保護類和成員。這是經過使用(不奇怪)的私有,公共,封裝和保護的屬性來實現。

你也能夠告訴javadoc的任務,包括使用相應屬性的做者和版本信息。

你也能夠組包一塊兒使用的組屬性,所以,它是易於瀏覽。

所有放在一塊兒

讓咱們繼續咱們的主題 Hello world Fax 應用程序。讓咱們添加一個文件的目標咱們的傳真應用程序項目。

下面是咱們的項目中使用的例子Javadoc任務。

<target name="generate-javadoc">
    <javadoc packagenames="faxapp.*" sourcepath="${src.dir}" 
        destdir="doc" version="true" windowtitle="Fax Application">
      <doctitle><![CDATA[= Fax Application =]]></doctitle>
      <bottom>
         <![CDATA[Copyright © 2011. All Rights Reserved.]]>
      </bottom>
      <group title="util packages" packages="faxapp.util.*"/>
      <group title="web packages" packages="faxapp.web.*"/>
      <group title="data packages" 
                          packages="faxapp.entity.*:faxapp.dao.*"/>
    </javadoc>
    <echo message="java doc has been generated!" />
</target>

在這個例子中,咱們指定使用對於src.dir做爲源目錄和文檔做爲目標目錄中的javadoc。咱們還定製了窗口標題,頁眉和出現的Java文檔頁面上的頁腳信息。

此外,咱們已經建立了三組。一個用於爲用戶界面類和一組數據庫相關類在咱們的源文件夾,一組實用程序類。你可能會注意到數據包組有兩個包 - faxapp.entity和faxapp.dao。

運行javadoc的Ant任務如今將生成並放置在doc文件夾中的Java文檔文件。

當執行javadoc target,它會產生如下結果:

C:>ant generate-javadoc
Buildfile: C:uild.xml

java doc has been generated!

BUILD SUCCESSFUL
Total time: 10.63 second

Java文檔文件如今出如今doc文件夾。

一般狀況下,產生的釋放或包的目標部分的Javadoc文件。

 

10.Ant建立JAR文件

編譯Java源文件後的下一個合乎邏輯的步驟,是創建在Java歸檔,JAR文件。建立JAR文件與Ant用jar任務很容易。如下展現的是jar任務的經常使用屬性

屬性 描述
basedir The base directory for the output JAR file. By default, this is set to the base directory of the project.
compress Advises ant to compress the file as it creates the JAR file.
keepcompression While the compress attribute is applicable to the individual files, thekeepcompression attribute does the same thing, but it applies to the entire archive.
destfile The name of the output JAR file
duplicate Advises Ant on what to do when duplicate files are found. You could add, preserve or fail the duplicate files.
excludes Advises Ant to not include these comma separated list of files in the package.
excludesfile Same as above, except the exclude files are specified using a pattern.
inlcudes Inverse of excludes
includesfile Inverse of excludesfile.
update Advises ant to overwrite files in the already built JAR file.

繼續咱們的Hello World傳真應用程序項目,讓咱們添加一個新的目標,產生的jar文件。但在此以前,讓咱們考慮一下jar任務:

<jar destfile="${web.dir}/lib/util.jar"
     basedir="${build.dir}/classes"
     includes="faxapp/util/**"
     excludes="**/Test.class"
/>

在這個例子中,web.dir屬性指向的網頁源文件的路徑。在咱們的例子中,這是其中的util.jar將被放置。

在這個例子中,build.dir屬性指向build文件夾在哪裏能夠找到 util.jar的類文件。

在這個例子中,咱們建立了一個名爲util.jar使用的類從faxapp.util一個jar文件。*包。然而,咱們不包括用名稱測試結束課程。輸出的jar文件會發生在webapp的lib文件夾。

若是咱們想使util.jar一個可執行JAR文件,咱們須要添加清單與主Classmeta屬性。

所以,上面的例子將被更新爲:

<jar destfile="${web.dir}/lib/util.jar"
     basedir="${build.dir}"
     includes="faxapp/util/**"
     excludes="**/Test.class">
</jar>

在這個例子中,web.dir屬性指向的網頁源文件的路徑。在咱們的例子中,這是其中的util.jar將被放置。

在這個例子中,build.dir屬性指向build文件夾在哪裏能夠找到 util.jar的類文件。

在這個例子中,咱們建立了一個名爲util.jar使用的類從faxapp.util一個jar文件。*包。然而,咱們不包括用名稱測試結束課程。輸出的jar文件會發生在webapp的lib文件夾。

若是咱們想使util.jar一個可執行JAR文件,咱們須要添加清單與主Classmeta屬性。

所以,上面的例子將被更新爲

    <jar destfile="${web.dir}/lib/util.jar"
         basedir="${build.dir}"
         includes="faxapp/util/**"
         excludes="**/Test.class">
         <manifest>
          <attribute name="Main-Class" value="com.yiibai.util.FaxUtil"/>
         </manifest>
    </jar>

要執行jar任務,一個目標裏面把它包(最多見,構建或包的目標,並運行它們。

    <target name="build-jar">
    <jar destfile="${web.dir}/lib/util.jar"
         basedir="${build.dir}"
         includes="faxapp/util/**"
         excludes="**/Test.class">
         <manifest>
          <attribute name="Main-Class" value="com.yiibai.util.FaxUtil"/>
         </manifest>
    </jar>
    </target>

在這個文件運行Ant會爲咱們建立util.jar文件

下面的結果是運行Ant文件的結果:

 
C:>ant build-jar
Buildfile: C:uild.xml

BUILD SUCCESSFUL
Total time: 1.3 seconds
 

如今的util.jar文件放置在輸出文件夾。

 

11.Ant建立WAR文件

建立WAR文件與Ant是很是簡單,很是相似於建立JAR文件的任務。畢竟WAR文件是像JAR文件只是另外一個ZIP文件。

WAR任務是一個擴展的JAR任務,但它有一些很好的補充操縱什麼進入的WEB-INF/classes文件夾中,並生成web.xml文件。在WAR的任務是很是有用的指定WAR文件的特定佈局。

因爲WAR的任務是jar任務的擴展,jar任務的全部屬性應用到WAR任務。下面是被指定到WAR任務的擴展屬性:

Attributes 描述
webxml Path to the web.xml file
lib A grouping to specify what goes into the WEB-INFlib folder.
classes A grouping to specify what goes into the WEB-INFclasses folder.
metainf Specifies the instructions for generating the MANIFEST.MF file.

繼續咱們Hello World傳真應用程序項目,讓咱們添加一個新的目標,產生的jar文件。但在此以前,讓咱們考慮WAR任務。請看下面的例子

       <war destfile="fax.war" webxml="${web.dir}/WEB-INF/web.xml">
       <fileset dir="${web.dir}">
             <exclude name="**/portlet.jar"/>
          <include name="**/*.*"/>
       </fileset>     
       <classes dir="${build.dir}"/>
    </war>

 

按照前面的例子中,web.dir變量指的是源Web文件夾,即包含了JSP的文件夾,CSS,JavaScript文件等。

build.dir變量是指輸出文件夾 - 這是在哪裏能夠找到類的WAR包。一般狀況下,這些類將被捆綁到WAR文件的WEB-INF/classes文件夾中。

在這個例子中,咱們建立一個名爲fax.war 的 war文件。從網頁源文件夾中得到的web.xml文件。全部從網上下了「WebContent」文件夾中的文件複製到WAR文件。

WEB-INF/lib文件夾中填充了來自第三方的jar文件夾中的jar文件。然而,咱們不包括porlet.jar,由於這是已經存在於應用服務器 的lib文件夾。最後,咱們從構建目錄的Web文件夾中複製全部的類和放入放在WEB-INF/classes文件夾中。

 

包裹WAR任務的Ant目標(一般包)內,並運行它。這將在指定的位置建立WAR文件。

這是徹底能夠嵌套類,庫,metainf和WEBINF董事,使他們生活在分散的文件夾中的項目結構的任何地方。但最佳實踐建議,您的Web項目應具有的Web內容結構相似於WAR文件的結構。Fax應用程序項目都有使用這個基本原則概述結構。

要執行WAR任務,一個目標裏面把它包裹(最多見,構建或包的目標,並運行

    <target name="build-war">
       <war destfile="fax.war" webxml="${web.dir}/WEB-INF/web.xml">
       <fileset dir="${web.dir}">
             <exclude name="**/portlet.jar"/>
          <include name="**/*.*"/>
       </fileset>     
       <classes dir="${build.dir}"/>
    </war>
    </target>

 

在這個文件運行Ant會爲咱們建立了fax.war文件

下面的結果是運行Ant文件的結果:

C:>ant build-war
Buildfile: C:uild.xml

BUILD SUCCESSFUL
Total time: 12.3 seconds

如今的fax.war文件放置在輸出文件夾。 war文件的內容將是:

 

沒有portal.jar包

 

12.Ant打包應用

 

咱們已經知道Ant使用的Hello World Fax 的Web應用程序中零碎的不一樣。

如今是時候把一切融合在一塊兒,以建立一個完整的和完整的build.xml文件。考慮build.properties和build.xml文件列表以下:

build.properties

deploy.path=d\://tm

build.xml

<?xml version="1.0"?>

<project name="fax" basedir="." default="usage">
    <property file="build.properties"/>
    <property name="src.dir" value="src"/>
    <property name="web.dir" value="WebRoot"/>
    <property name="build.dir" value="${web.dir}/WEB-INF/classes"/>
    <property name="name" value="fax"/>

    <path id="master-classpath">
        <fileset dir="${web.dir}/WEB-INF/lib">
            <include name="*.jar"/>
        </fileset>
        <pathelement path="${build.dir}"/>
    </path>
    
    <target name="usage">
        <echo message=""/>
        <echo message="${name} build file"/>
        <echo message="-----------------------------------"/>
        <echo message=""/>
        <echo message="Available targets are:"/>
        <echo message=""/>
        <echo message="deploy    --> Deploy application 
          as directory"/>
        <echo message="deploywar --> Deploy application 
          as a WAR file"/>
        <echo message=""/>
    </target>

    <target name="build" description="Compile main 
      source tree java files">
        <mkdir dir="${build.dir}"/>
        <javac destdir="${build.dir}" source="1.5" 
          target="1.5" debug="true"
          deprecation="false" optimize="false" failonerror="true">
            <src path="${src.dir}"/>
            <classpath refid="master-classpath"/>
        </javac>
    </target>

    <target name="deploy" depends="build" 
      description="Deploy application">
        <copy todir="${deploy.path}/${name}" 
          preservelastmodified="true">
            <fileset dir="${web.dir}">
                <include name="**/*.*"/>
            </fileset>
        </copy>
    </target>

    <target name="deploywar" depends="build" 
      description="Deploy application as a WAR file">
        <war destfile="${name}.war"
             webxml="${web.dir}/WEB-INF/web.xml">
            <fileset dir="${web.dir}">
                <include name="**/*.*"/>
            </fileset>
        </war>
        <copy todir="${deploy.path}" preservelastmodified="true">
            <fileset dir=".">
                <include name="*.war"/>
            </fileset>
        </copy>
    </target>
    

    <target name="clean" description="Clean output directories">
        <delete>
            <fileset dir="${build.dir}">
                <include name="**/*.class"/>
            </fileset>
        </delete>
    </target>


</project>

在這個例子中,咱們首先聲明的路徑的webapps文件夾中的Tomcat在生成屬性文件做爲deploy.path變量。咱們還聲明的源文件夾 src.dir的變量的java文件。而後咱們聲明的源文件夾中web.dir變量的網頁文件。 javadoc.dir是用於存儲Java文檔的文件夾,build.dir是用於存儲生成的輸出文件的路徑。

而後咱們聲明的Web應用程序,這是 Fax 在咱們的例子中的名稱。

咱們還定義了主類路徑的conains存在於項目的WEB-INF/lib文件夾中的JAR文件。咱們還包括了類文件呈如今build.dir在主類路徑

Javadoc的目標生產項目所需的Javadoc和使用對象是用來打印,是目前在構建文件的共同目標。

上面的例子顯示了兩個部署目標 - 部署和deploywar目標

部署目標文件從web目錄下的文件複製到deploy目錄保留最後修改的日期時間戳記。部署到支持熱部署一臺服務器時,這是頗有用的。

clean目標清除全部先前創建的文件。

部署war目標構建war文件,而後複製war文件到應用服務器的部署目錄。

輸出

 

 

13.Ant部署應用程序

在前面的章節中,咱們已經學會了如何打包應用程序並將其部署到一個文件夾中。在這個例子中,咱們打算把它更進一步。

咱們要部署Web應用程序直接到應用程序的服務器的部署文件夾,而後咱們將添加一些Ant目標來啓動和中止服務。讓咱們繼續的Hello World傳真的Web應用程序。這是一個延續前一章,新元件在突出紅色

build.properties

# Ant properties for building the springapp

appserver.home=c:\install\apache-tomcat-7.0.19
# for Tomcat 5 use $appserver.home}/server/lib
# for Tomcat 6 use $appserver.home}/lib
appserver.lib=${appserver.home}/lib

deploy.path=${appserver.home}/webapps

tomcat.manager.url=http://www.yiibai.com:8080/manager
tomcat.manager.username=yiibai
tomcat.manager.password=secret

build.xml

<?xml version="1.0"?>

<project name="fax" basedir="." default="usage">
    <property file="build.properties"/>
    <property name="src.dir" value="src"/>
    <property name="web.dir" value="WebRoot"/>
    <property name="build.dir" value="${web.dir}/WEB-INF/classes"/>
    <property name="name" value="fax"/>

    <path id="master-classpath">
        <fileset dir="${web.dir}/WEB-INF/lib">
            <include name="*.jar"/>
        </fileset>
        <pathelement path="${build.dir}"/>
    </path>
    
    <target name="usage">
        <echo message=""/>
        <echo message="${name} build file"/>
        <echo message="-----------------------------------"/>
        <echo message=""/>
        <echo message="Available targets are:"/>
        <echo message=""/>
        <echo message="deploy    --> Deploy application 
          as directory"/>
        <echo message="deploywar --> Deploy application 
          as a WAR file"/>
        <echo message=""/>
    </target>

    <target name="build" description="Compile main 
      source tree java files">
        <mkdir dir="${build.dir}"/>
        <javac destdir="${build.dir}" source="1.5" 
          target="1.5" debug="true"
          deprecation="false" optimize="false" failonerror="true">
            <src path="${src.dir}"/>
            <classpath refid="master-classpath"/>
        </javac>
    </target>

    <target name="deploy" depends="build" 
      description="Deploy application">
        <copy todir="${deploy.path}/${name}" 
          preservelastmodified="true">
            <fileset dir="${web.dir}">
                <include name="**/*.*"/>
            </fileset>
        </copy>
    </target>

    <target name="deploywar" depends="build" 
      description="Deploy application as a WAR file">
        <war destfile="${name}.war"
             webxml="${web.dir}/WEB-INF/web.xml">
            <fileset dir="${web.dir}">
                <include name="**/*.*"/>
            </fileset>
        </war>
        <copy todir="${deploy.path}" preservelastmodified="true">
            <fileset dir=".">
                <include name="*.war"/>
            </fileset>
        </copy>
    </target>
    

    <target name="clean" description="Clean output directories">
        <delete>
            <fileset dir="${build.dir}">
                <include name="**/*.class"/>
            </fileset>
        </delete>
    </target>


<!-- ============================================================ -->
    <!-- Tomcat tasks -->
    <!-- ============================================================ -->

    <path id="catalina-ant-classpath">
        <!-- We need the Catalina jars for Tomcat -->
        <!--  * for other app servers - check the docs -->
        <fileset dir="${appserver.lib}">
            <include name="catalina-ant.jar"/>
        </fileset>
    </path>

    <taskdef name="install" 
        classname="org.apache.catalina.ant.InstallTask">
        <classpath refid="catalina-ant-classpath"/>
    </taskdef>
    <taskdef name="reload" 
        classname="org.apache.catalina.ant.ReloadTask">
        <classpath refid="catalina-ant-classpath"/>
    </taskdef>
    <taskdef name="list" 
        classname="org.apache.catalina.ant.ListTask">
        <classpath refid="catalina-ant-classpath"/>
    </taskdef>
    <taskdef name="start" 
        classname="org.apache.catalina.ant.StartTask">
        <classpath refid="catalina-ant-classpath"/>
    </taskdef>
    <taskdef name="stop" 
         classname="org.apache.catalina.ant.StopTask">
        <classpath refid="catalina-ant-classpath"/>
    </taskdef>

    <target name="reload" description="Reload application in Tomcat">
        <reload url="${tomcat.manager.url}"
                 username="${tomcat.manager.username}"
                 password="${tomcat.manager.password}"
                 path="/${name}"/>
    </target>

</project>

在本練習中,咱們使用Tomcat做爲咱們的應用服務器。首先,在構建屬性文件中,咱們定義了一些附加屬性。

  • appserver.home應用指向安裝路徑到Tomcat應用服務器。

  • appserver.lib指向Tomcat的安裝文件夾中的庫文件。

  • deploy.path變量如今指向Tomcat中的web應用文件夾。

在Tomcat中的應用程序能夠中止和startedusing Tomcat管理應用程序。也是在build.properties文件中指定的URL管理器應用程序,使用用戶名和密碼。接下來咱們聲明一個新的 CLASSPATH中包含catalina-ant.jar文件。這個jar文件是必需經過Apache Ant來執行Tomcat 任務。

catalina-ant.jar 文件提供瞭如下任務:

Properties 描述
InstallTask Installs a web application. Class Name: org.apache.catalina.ant.InstallTask
ReloadTask Reload a web application. Class Name: org.apache.catalina.ant.ReloadTask
ListTask Lists all web applications. Class Name: org.apache.catalina.ant.ListTask
StartTask Starts a web application. Class Name: org.apache.catalina.ant.StartTask
StopTask Stops a web application. Class Name: org.apache.catalina.ant.StopTask
ReloadTask Reloads a web application without stopping. Class Name: org.apache.catalina.ant.ReloadTask

重裝任務須要如下附加參數。
- 1)URL到管理器應用程序
2)用戶名從新啓動Web應用程序
3)密碼從新啓動Web應用程序從新啓動Web應用程序
4)名稱

讓咱們發出的deploy-war命令的web應用程序複製到Tomcat的webapps文件夾中,而後讓咱們從新加載該傳真的Web應用程序。下面的結果是運行Ant文件的結果:

C:>ant deploy-war
Buildfile: C:uild.xml

BUILD SUCCESSFUL
Total time: 6.3 seconds

C:>ant reload
Buildfile: C:uild.xml

BUILD SUCCESSFUL
Total time: 3.1 seconds

一旦上述任務運行時,Web應用程序部署和Web應用程序從新加載。

 

14.Ant執行Java代碼

package faxapp.dao;

public class dao {

    public dao() {
        // TODO Auto-generated constructor stub
    }

    public static void main(String[] args) {
        System.out.println("------------------"+args[0]);

    }

}

下面是執行這個java類簡單的構建。

<?xml version="1.0"?>
<project name="sample" basedir="." default="notify">
    <property name="src.dir" value="src"/>
    <property name="web.dir" value="WebRoot"/>
    <property name="build.dir" value="${web.dir}/WEB-INF/classes"/>
  <target name="notify">
    <java fork="true" failonerror="yes" classname="faxapp.dao.dao">
      <arg line="admin@test.com"/>
       <classpath path="${build.dir}"></classpath>
    </java>
  </target>
</project>

當執行構建時,它會產生如下結果:

 

主意,必定要先編譯生成class

 

 

15.Ant和Eclipse集成

若是您已經下載並已經安裝了Eclipse,你不多作上手。 Eclipse中預裝捆綁在一塊兒的Ant的插件,隨時供您使用。

按照簡單的步驟,到Ant集成到Eclipse中。

  • 確保build.xml文件就是java項目的一部分,並無生活在一個位置,是外部的項目。

  • 經過將啓用Ant視圖 Window > Show View > Other > Ant > Ant

  • 打開項目資源管理器中,拖動的build.xml到Ant視圖

Ant視圖中顯示如今看起來相似於:

Eclipse Ant Integration

點擊目標,build / clean / usage將運行Ant你的目標。 

點擊"fax" ,將執行默認的目標 -  usage

Ant的Eclipse插件還附帶了一個很好的編輯器來編輯的build.xml文件。該編輯器是知道的build.xml架構,能夠幫助您提供代碼完成。

要使用Ant編輯器,右鍵單擊您的build.xml(從項目資源管理器),而後選擇打開方式>Ant Editor。 Ant Editor應該loook相似於:

Eclipse Ant Integration

Ant 編輯器列出了右手邊的目標,該目標列表做爲一個書籤,讓你直接跳到編輯特定的目標。

 

16.Ant Junit集成

JUnit 是基於Java經常使用的單元測試框架進行開發。它是易於使用和易於延伸。有許多JUnit擴展可用。若是你不熟悉Junit的,你應該從www.junit.org下載JUnit和閱讀JUnit的使用手冊。

本教程討論了關於執行使用Ant 的JUnit測試。Ant 經過這個簡單Junit 的任務變得簡單。

如下展現的是JUnit 任務的屬性。

Properties 描述
dir Where to invoke the VM from. This is ignored when fork is disabled.
jvm Command used to invoke the JVM. This is ignored when fork is disabled.
fork Runs the test in a separate JVM
errorproperty The name of the property to set if there is a Junit error
failureproperty The name of the property to set if there is a Junit failure
haltonerror Stops execution when a test error occurs
haltonfailure Stops execution when a failure occurs
printsummary Advices Ant to display simple statistics for each test
showoutput Adivces Ant tosend the output to its logs and formatters
tempdir Path to the temporary file that Ant will use
timeout Exits the tests that take longer to run than this setting (in milliseconds).

讓咱們繼續的Hello World fax web應用程序的主題,並添加一個JUnit目標。

下面的例子展現了一個簡單的JUnit測試執行

<?xml version="1.0"?>
<project name="junit" basedir="." default="unittest">
    <property name="src.dir" value="src"/>
    <property name="web.dir" value="WebRoot"/>
    <property name="build.dir" value="${web.dir}/WEB-INF/classes"/>    
    <path id="master-classpath">
        <fileset dir="${web.dir}/WEB-INF/lib">
            <include name="*.jar"/>
        </fileset>
        <pathelement path="${build.dir}"/>
    </path>
      <target name="unittest">
        <junit haltonfailure="true" printsummary="true">
          <test name="faxapp.junit.JunitTest"/>
        <classpath refid="master-classpath"/>
        </junit>
      </target>
    
</project>

上面的例子顯示的Junit對com.yiibai.UtilsTest JUnit類執行。運行上面會產生下面的輸出

 

主意,必定要先編譯生成class,還有添加jar包支持

 

 

 

轉子:http://www.yiibai.com/ant/ant_junit_integration.html

相關文章
相關標籤/搜索