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

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

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

    隨筆-71  評論-4  文章-0  trackbacks-0
    下載并且安裝Ant

         Ant 是一個純Java工具,所以,要運行它,首先需要安裝一個Java虛擬機(JVM)。你可能已經安裝了一個JVM,但是如果還沒有,你可以從 http://java.sun.com/j2se/1.4/download.html 上面免費下載一個。然后,從 http://www.apache.org/dist/jakarta/jakarta-ant/release/v1.4.1/bin/ 下載Ant的二進制版本。將Ant壓縮文檔unzip或者untar(取決于你的系統平臺)到你選擇的安裝目錄(Windows下面通常是c:\Ant,UNIX下面通常是/usr/local/ant)。

        在軟件安裝完成之后,必須指示你的系統去找到這兩個目錄來啟動那些應用程序。通過將這兩個工具的bin目錄放置到你的PATH環境變量中做到這一點。此外,你應該定義JAVA_HOME和ANT_HOME環境變量來讓那些工具了解它們的位置。

    如果你用的系統是Windows,那么你需要在autoexec.bat文件中加入以下數行語句:

    set JAVA_HOME=<JAVA_HOME>
    set ANT_HOME=<ANT_HOME>
    set PATH=%PATH%;<JAVA_HOME>\bin;<ANT_HOME>\bin

          重啟機器以完成安裝。如果系統報告說傳遞了太多的參數到SET命令,那么可能是PATH中包含了空格。要解決這個問題,就在一個單一行中定義PATH,并且將它用雙引號引起來。

          如果你的系統是UNIX并且正在使用Bash外殼,在~/.bash_profile文件中加入以下數行:

    JAVA_HOME=<JAVA_HOME>
    ANT_HOME=<ANT_HOME>
    PATH=$PATH:<JAVA_HOME>/bin:<ANT_HOME>/bin
    export JAVA_HOME ANT_HOME PATH

        運用其他外殼的用戶應該改寫這段腳本并且編輯合適的配置文件。為更新系統環境,輸入.~/.bash_profile。為測試是否成功安裝,在終端窗口輸入java 和ant 命令。系統會發現這些命令并運行之。

        Ant像Make一樣工作。進入要運行的buildfile(其缺省的名字為build.xml)所在的目錄,然后輸入ant。要運行另外一個目錄中的buildfile或者名字不是build.xml的buildfile,需要使用-buildfile參數。Ant也可以通過使用-find參數在文件系統中遞歸地找到所需的buildfile,因此可以從工程中的任意地方啟動Ant。要顯示關于命令行ant參數的幫助,請輸入 ant -help。

    Ant簡介

    作者:Michel Casabianca

    本文講述如何使用這個具有極大價值的工具(Ant)來構建和部署Java工程。

        Ant是一個用于簡單或復雜Java工程的自動化構建、部署工具,它對于那些具有分布式開發團隊或者相信通過頻繁的構建來進行不間斷集成的公司尤其有用。對于那些建立傳統全Java應用程序以及那些使用HTML、JSP和Java servlets創建Web應用程序的公司來說,Ant極具價值。無論你的Java開發者使用什么操作系統、集成開發環境或者構建環境,Ant都可以將你的工程集合在一起,用于那些重要的構建。Ant也能夠自動化并且同步文檔部署,這通常發生在軟件開發過程中的沒有正式文檔和文檔比較混亂的部分。

        在構建和部署Java應用程序的時候,Ant處理著大量有用的任務。最基本的任務包括添加和移除目錄、使用FTP拷貝和下載文件、創建JAR和ZIP文件以及創建文檔。更高級的特性包括用源代碼控制系統諸如CVS或者SourceSafe來檢查源代碼、執行SQL查詢或腳本、將XML文件轉換為人能識別的HTML,以及為遠程方法調用生成stub(存根)文件。

       Ant和Make(非常著名的構建工具,很多C語言開發人員都使用它)之間有什么不同?Ant是為Java而創建,帶有屬于其自身的、獨特的范例,具有可移植性。而Make依賴于固定的操作系統命令(因此一個運行在微軟Windows下的Make文件對于使用UNIX的開發者來說毫無用處),利用Ant構建的純Java工程是可移植的,因為Ant本身就是用Java編寫的,并且Ant bulidfiles使用XML語法。

    本文將向你展示一個典型的Ant文件,它使用了很多的Ant基本任務。

    一個典型的Ant工程

        Ant使用用XML編寫的、稱作bulidfile的工具來開展它的工作。讓我們考慮一個源文件在src目錄中、類庫(包括JAR文件)在lib目錄中、API文檔在doc/api目錄中的典型Java工程。我們可以利用如下的Ant buildfile來構建這個工程。

    <?xml version="1.0"?>
    <project name="typical" default="all" basedir=".">
     <property name="name" value="typical"/>
     <property name="src" value="src"/>
     <property name="lib" value="lib"/>
     <property name="api" value="doc/api"/>
    
     <property name="tmp" value="tmp"/>
     <property name="classpath" value="${lib}/${name}.jar"/>
     <property name="main" value="test.Main"/>
    
     <target name="bin"
             description="Compile Java source files">
      <javac srcdir="${src}"
             destdir="${tmp}"
             debug="on"
    
             deprecation="on"/>
     </target>
    
     <target name="jar" depends="bin"
             description="Build jar file">
      <jar jarfile="${lib}/${name}.jar"
           basedir="${tmp}"/>
     </target>
    
     <target name="run" depends="jar"
    
             description="Run the program">
      <java classname="${main}"
            classpath="${classpath}"/>
     </target>
     <target name="api"
             description="Generate API documentation">
      <javadoc sourcepath="${src}"
               destdir="${api}"
               packagenames="test.*"/>
     </target>
    
    
     <target name="clean"
             description="Clean generated files">
      <delete dir="${tmp}"/>
      <mkdir dir="${tmp}"/>
     </target>
    
     <target name="all" depends="clean,jar,api"/>
    
    </project>
                      

    也許這里的語法看起來非常冗長(你可以使用Make寫一個短的多的buildfile),但是Ant buildfile的優點是其可讀性好。

        buildfile的內容被包含在元素中。工程一般有一套工程屬性,帶有一些區--由一些Ant任務諸如編譯源代碼、生成目錄和生成JAR文件等組成。

        工程和屬性。在 元素下面首先可以找到屬性。這些屬性元素類似于變量。你通常可以按照任務在工程內的任何地方使用屬性值,這些任務是通過使用表達式 $ {屬性名(property-name)} 在< target> 元素中定義的。舉例來說,在上述的buildfile 例子中,值${src}會被解析成src,因為我們在屬性區中對它是如此定義的。在我們的buildfile中,我們使用${src}屬性作為在javac任務中的srcdir的特性的值。

       當在命令行中用句法-Dproperty=value來調用Ant的時候,可能會定義或者重寫屬性。比如說,如果你想將src的值設定為source-directory,你可以在命令行中鍵入ant DDsrc=sourc_directory。此外,屬性是恒定的,所以一旦被定義,就不能修改它們的值。

       目標和任務。目標(target)元素定義了一套指令來實現某類工作。可以把它們比作由很多任務構成的程序函數(與編程指令相比)。舉例來說,在上述的buildfile例子中,名為jar的目標(具有屬性name=jar的元素)包含有一個單一的任務以從類文件來生成JAR文件。這個例子中只是湊巧目標名稱和任務名稱相同,但是這個并不是必需的--目標元素名稱是由創建者選擇的,但是任務名稱是固定的,并且與那些定義在Ant標記中引用的目標名相匹配。這個特殊的目標(我們的目標)依賴于bin 目標(比如說,depends=bin),這意味著如果目標 jar被調用,那么它就會首先調用bin目標(如果bin目標還沒有被執行)。當調用Ant時,你可以傳遞一個目標在命令行上運行。比如說,通過在命令行輸入命令ant jar調用Ant,可以運行目標jar。如果不指定一個目標而調用Ant,在工程的默認屬性中指定的目標就會被運行(在本例中,是"all"目標)。你也可以通過用空格分隔目標的辦法來調用帶有多個目標的Ant。

    目標及其任務

      如前所述,Ant bulidfile是一個處理工程構建或部署給定階段的目標的集合。在這里我將描述在我們的示例buildfile中使用到的目標,并詳細說明在使用這些目標及其相關的任務的時候會碰到的一些常見問題。你可以根據自身的需要快速地定制這里所展示的bulidfile。以下的例子描述了這些通過使用我們的Ant bulidfile完成這些工作的步驟:

    1. 編譯Java源文件
    2. 創建JAR文件
    3. 運行程序
    4. 生成API文檔
    5. 清除生成的class(類)文件

    1. 編譯Java源文件

    這個目標的使用可能是最廣泛的。通常由以下代碼來實現:

    <target name="bin" description="Compile Java source files">
    
      <javac srcdir="${src}"
             destdir="${tmp}"
             debug="on"
             deprecation="on"/>
     </target>
                      

         這個目標包括一個單一的javac任務,這個任務就是編譯Java源文件。在上面的這個例子中使用的屬性非常簡單明了:srcdir是存放源文件的目錄,destdir是存放所生成的類文件的目錄。最后兩個屬性是用于javac編譯選項的。注意到optimize屬性(這里沒有使用)沒有什么用,所以最新的Java編譯器沒有將該屬性放入其中。當需要類庫進行編譯時,你應該添加一個classpath(類路徑)屬性以便在其中列出JAR文件或者目錄。可以在UNIX或者Windows系統下面寫一個Ant路徑,其中使用冒號或者分號作為路徑的分隔標記,使用斜線或者反斜線作為文件的分隔標記。這樣,定義為lib/foo.jar:lib/bar.jar的classpath在UNIX下不用修改就可以直接使用,而在Windows下就會被自動轉換成lib\foo.jar;lib\bar.jar。

       這個任務力圖使用與JDK一起提供的編譯器。該編譯器是帶有其自有類的 Java程序,其自有類存在于tools.jar文件中(該文件位于lib目錄中)。這樣,tools.jar文件必須在classpath中被指定。在很多操作系統中(包括Solaris和Linux),這個不成其為問題,在使用javac任務時,如果Ant不能使用這個標準編譯器的話,它就會抗議。為了解決該問題,只要簡單地將lib/tools.jar文件與jre/lib/ext/tools.jar做一個鏈接就可以了。

    2. 創建一個JAR文件

    這個任務從Java類(以及諸如圖片或者本地文件等其他資源)生成一個JAR文件。在我們的示例buildfile中,通過如下代碼實現:

    <target name="jar" depends="bin"
             description="Build jar file">
      <jar jarfile="${lib}/${name}.jar" basedir="${tmp}"/>
     </target>
                      

         jar元素的屬性非常明顯。當你想要包括文檔庫中的其他文件時,你可以在任務中放置fileset元素。如同它們的名字所暗示的那樣,那些元素(并不是任務本身)定義了一系列的文件。讓我們設想一下,如果你想要引入一些位于img目錄中的PNG(Portable Network Graphics)格式的圖片文件,你應該編寫如下代碼:

    <target name="jar" depends="bin"
            description="Build jar file">
     <jar jarfile="${lib}/${name}.jar"
          basedir="${tmp}">
      <fileset dir="img" includes="*.png"/>
    
     </jar>
    </target>
                      

       dir屬性指出了文件的基本目錄;而includes包含了一個表達式,該表達式定義了一些文件以包括在fileset中。那些表達式有一個與shell命令非常接近的句法,"*"字符匹配零個或者多個字符而"?"只匹配一個字符。你可以在目錄樹中(包括零)使用表達式"**"來替代任意數目的目錄。比如說,如果在上述的例子中要包括的圖片位于img的任意一個子目錄中,那么應該在jar元素中放置如下所示的fileset:

    <fileset dir="img" includes="**/*.png"/> 
                      

        也可以使用excludes屬性把文件從fileset中排除。比如說,要包括在img目錄中的除了.ida類型的所有其他文件,那么可以按照如下方式編寫fileset:

    <fileset dir="img" excludes="**/*.dia"/>
                          

        缺省情況下,某些文件是被所有的fileset排除在外的,這些文件是編輯器生成的備份文件(例如UNIX下的**/*~文件)和版本控制目錄(例如**/CVS/*)。如果要告訴Ant你不想排除那些文件,那么就需要在fileset元素中加入屬性defaultexcludes="false"。

    Ant也可以處理用于打包Web應用程序的WAR文件和用于更復雜應用程序的EAR文件,這些復雜的應用程序經常結合使用JSP、Servlets和EJB。Ant有專門的任務來生成WAR和EAR文件。那些任務是JAR任務的擴展,定義了新的嵌套元素和屬性。WAR任務定義了等嵌套元素,這些元素定義特別的fileset的元素。包括在那些fileset中的文件將在文檔庫的WEB-INF/lib、WEB-INF/classes和WEB-INF以及META-INF目錄中結束。同時,它也為該文檔(WEB-INF/web.xml)的部署描述符定義webxml屬性。

    EAR任務使用元素來將文件放入文檔的META-INF目錄,將appxml屬性用于部署描述符(META-INF/application.xml)。

    3. 運行程序

    為運行Java應用程序,需要使用java任務,如下面的代碼所示:

    <target name="run" depends="jar"
             description="Run the program">
      <java classname="${main}"
            classpath="${classpath}"/>
     </target>
                      

    classname定義了包括main()方法運行程序的打包的類的名稱,classpath包含了運行它的類路徑。可以使用嵌套的arg元素傳遞命令行參數,或者通過嵌套sysproperty元素定義系統屬性。這兩種動作執行起來都會非常快,因為缺省情況下,該程序運行在運行Ant的虛擬機(可以使用fork屬性讓Ant啟動一個新的虛擬機)上。

    元素中,通過使用classpath屬性指定了類路徑。用或者子元素(subelement)嵌套也是可以的。比如說,要在lib目錄下包括在classpath屬性中的條目、目錄類以及所有的JAR文件,可以編寫如下代碼:

    <java classname="${main}">
     <classpath>
        <pathelement path="${classpath}"/>
        <pathelement location="classes"/>
        <fileset dir="lib" includes="*.jar"/>
       </classpath>
      </java>
                      

    如果要重用一個路徑,我們可以在元素中定義它及其ID,并且在元素引用它們。舉例來說,如果我們想重用在上面定義的路徑,可以按照如下所示編寫代碼:

    	 <path id="run.path">
    	   <pathelement path="${classpath}"/>
    	   <pathelement location="classes"/>
    	   <fileset dir="lib" includes="*.jar"/>	 
    	 </path>
                      

    4. 生成API文檔

    這里的目標是通過使用javadoc生成API文檔。大體說來,這是由一個單一javadoc任務構成的簡易目標,代碼如下:

      <target name="api"
             description="Generate API documentation">
        <javadoc sourcepath="${src}"
               destdir="${api}"
               packagenames="test.*"/>
       </target>
                      

    sourcepath和destdi是顯而易見的屬性。packagenames屬性是一個以逗號分隔的、提供文檔的包列表。雖然Java的import語句不是遞歸的,但是packagenames屬性卻是遞歸的。這意味著語句packagenames="test.*"可以為test包、test.foo包和test.foo.bar包提供文檔,但是不會為foo或者foo.test包提供文檔。

    可以使用windowtitle、doctitle、header、footer和bottom這些包含HTML代碼的屬性定義窗口和文檔的標題以及所生成頁面的頁眉、頁腳和底行。注意:應該用相應的XML實體(< 和")來代替XML格式字符(< 和 ")。也可以用link屬性為文檔鏈接指定一個URL。我們會說你用String參數編寫了一個方法。對于一個生成的不帶有link屬性的文檔,在方法文檔中你就只有一個純文本java.lang.String。當使用一個合適的link屬性時,這將顯示為一個到Sun的java.lang.String類的文檔的鏈接。

    5. 清除生成的類文件

    該目標清除生成的類文件。比如說,要清除在tmp子目錄中的類文件(以及其他資源),可以編寫如下代碼:

    <target name="clean"
             description="Clean generated files">
      <delete dir="${tmp}"/>
      <mkdir dir="${tmp}"/>
     </target>
                      

    清除類文件總是一個很好的主意,因為它可以在將來的編譯中避免錯誤的相關性問題。假設你在類A中定義了一個常量foo,并且在類B中使用它。當你編譯這些Java源文件的時候,foo的值被嵌入在B的類文件中。如果你修改foo的值,并且重新編譯(沒有刪除類文件),javac任務就不會編譯類B,因為它的源文件比相應的類要舊,因此舊的值將保持不變。即便用javac使用depend屬性也不能解決這個問題,因為Java編譯器的這個選擇是一種錯誤。Jikes的相關性檢查較好,但是你應該重新構建所有的類文件,這樣才是最快的辦法。

    當你在HTML中用樣式表時會遇到類似的問題。style任務不檢查要使用樣式表的日期。這樣的話,如果你對那些文件進行操作,該任務將不會生成目標文件(通常是HTML文件)。你可以通過使用force屬性來強制性地生成文件,但是這樣通常是效率極低的。在這種情況下,通過下面的clean目標可以刪除所生成的HTML文件(在doc屬性目錄中):

     <target name="clean">
       <delete dir="${tmp}"/>
       <mkdir dir="${tmp}"/>
       <delete><fileset dir="${doc}" includes="*.html"/></delete>
     </target>
                      

    為解決這些相關性問題,當你生成新版本的文件時,應該不時地運行clean目標。

    posted on 2006-01-12 12:41 zjw_albert 閱讀(147) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 人人爽人人爽人人片A免费| 在线成人a毛片免费播放| 妇女自拍偷自拍亚洲精品| 亚洲男人天堂av| 亚洲色欲久久久久综合网| 久久精品国产精品亚洲艾| 国产美女a做受大片免费| 亚洲国产精品免费在线观看| fc2免费人成在线视频| 亚洲av无码偷拍在线观看| 亚洲国产成人精品无码一区二区| 亚洲色成人中文字幕网站| 国产精品酒店视频免费看 | 亚洲欧洲日产国码高潮αv| 91麻豆最新在线人成免费观看 | 国产午夜亚洲精品国产成人小说| 全免费a级毛片免费看不卡| 91精品视频免费| 95免费观看体验区视频| 免费污视频在线观看| 一区二区在线视频免费观看| 色妞www精品视频免费看| 亚洲午夜无码久久| 最新亚洲精品国偷自产在线| 亚洲精品免费在线视频| 亚洲男人第一av网站| 亚洲五月六月丁香激情| 亚洲爱情岛论坛永久| 亚洲av无码无在线观看红杏| 亚洲乱码一区二区三区在线观看 | 亚洲免费在线播放| 亚洲综合精品一二三区在线| 久久亚洲AV午夜福利精品一区 | a级毛片免费观看在线| 一级毛片免费播放视频| www在线观看免费视频| 4hu四虎免费影院www| 国产区在线免费观看| 大地资源网高清在线观看免费| 成人免费区一区二区三区| 日韩a级无码免费视频|