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

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

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

    pzxsheng

    有種相見不敢見的傷痛,有種愛還埋藏在心中

    利用 Ant 和 Eclipse 有效地提高部署工作效率

    本文轉(zhuǎn)自:http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342671.html

     

    讀者定位為具有 Java 和 Ant 使用經(jīng)驗的開發(fā)人員。

    讀者可以學(xué)習(xí)到如何使用 Ant 解決一些多用戶開發(fā)環(huán)境中,根據(jù)不同的目標環(huán)境編譯成不同部署包的問題。

    工作場景

    現(xiàn)在有一個 web 項目,是多人進行開發(fā)的,通過 CVS 來管理。另外該項目還有一些測試人員,他們測試部署在測試服務(wù)器上的應(yīng)用程序,發(fā)現(xiàn) bug 后通過 bug 管理系統(tǒng)通知開發(fā)人員,在開發(fā)人員修復(fù) bug 并經(jīng)過本地測試后,由專門的人負責(zé)檢出(check out)代碼,編譯打包后部署到測試服務(wù)器上。

    該項目的成員小 A 就是負責(zé)檢出代碼、編譯打包,并部署到服務(wù)器上的人。除了這個任務(wù)之外,他還是該項目的編程人員。在項目進入測試階段后,小 A 在得到組中別的成員修復(fù)了 bug 并且檢入(check in)了代碼的消息后(也有可能是小 A 自己檢入了代碼),小 A 首先更新本地的代碼,先在本地做測試,確認修復(fù)了 bug 后打成 WAR 包部署到測試服務(wù)器上,并通知測試人員已經(jīng)修復(fù)了 bug,讓測試人員繼續(xù)進行測試。

    小 A 的煩惱

    在該項目中,有一些為測試方便開發(fā)而寫的代碼和頁面,比如跳過用戶認證,但是在部署到測試機環(huán)境的時候,需要刪除這些代碼和頁面;另外作為一個具有靈活性和擴展性的應(yīng)用程序,又有一些配置文件,配置文件中的值會根據(jù)環(huán)境的改變而變動。例如,在項目中使用了 Log4j 記錄日志,需要給 Log4j 指定日志文件的保存路徑,本地程序員開發(fā)的時候用的是 Windows 系統(tǒng),給 Log4j 指定的也是 Windows 的文件系統(tǒng),在測試階段的時候,需要部署到 Linux 系統(tǒng)中,那么日志的保存路徑也需要做相應(yīng)的改動。部署到測試服務(wù)器上的時候,除了 Log4j 需要改之外,還有很多別的配置項目也需要變動,并且分散在各個 package 中。小 A 的煩惱也隨之而來,每次他在做完本地測之后,就根據(jù)測試機的需要逐個找配置文件,更改相應(yīng)的值,并刪除那些為測試方便寫的代碼和頁面,每天可能根據(jù)需要做好幾次這樣的事情,最煩的是他在快做完對測試機環(huán)境更改的時候,某開發(fā)人員突然通知小 A 說:“我又改了一點代碼,剛檢入,你再重打一個包吧。”,小 A 又不得不從頭開始做新一輪的檢出代碼、本地測試、更改配置文件、刪除不需要的文件、打包部署的工作。另外小 A 在測試階段的后期被通知要求除了每次生成一個測試環(huán)境的 WAR 包外還必須生成一個在產(chǎn)品環(huán)境下的 WAR 包,他做的事情就更多了。

    從上面的場景可以看出,小 A 的工作效率低而且容易出錯,甚至有可能導(dǎo)致整個項目的工作效率低下。其實可以通過 Ant 來幫助小 A 快速而且有效地完成這個工作。在 Ant 中,根據(jù)目標環(huán)境的需要,可以把所有要更改的配置文件的項目集中寫到某個配置文件中。這樣根據(jù)不同的目標環(huán)境得到不同的配置文件,Ant 在編譯包時根據(jù)不同的目標環(huán)境切換不同的配置文件即可。比如小 A 現(xiàn)在碰到的有 3 中環(huán)境:開發(fā)環(huán)境、測試環(huán)境以及產(chǎn)品環(huán)境,根據(jù)這三種環(huán)境可以生成三個不同的配置文件:develop_deploy.property、test_deploy. property 和 product_deploy. property,當(dāng)小 A 想生成不同的包時只需在這三個配置文件之間切換就可以了。

    在正式開始編寫腳本之前,我們需要下載安裝相應(yīng)的軟件。

    • Eclipse:為了使 Ant 的開發(fā)更加簡單,我們選擇了 Eclipse3.1 作為開發(fā)環(huán)境。當(dāng)然你可以使用任何你喜歡的文本編輯工具來開發(fā)你的 Ant。Eclipse 的最新版本可以在 http://eclipse.org/上下載。
    • Ant:Ant 是基于 Java 的編譯工具,它就像 C/C++ 中的 make,但是沒有 make 那樣難用。Ant 的最新版本可以在 http://ant.apache.org/bindownload.cgi上下載。如果你用 Eclipse 來開發(fā) Ant,則不用去單獨下載 Ant,因為在 Eclipse 中已經(jīng)集成了 Ant。
    • CVS 客戶端(cvs.exe):CVS 可以在 http://www.nongnu.org/cvs/上下載

    用 Eclipse3.1 來創(chuàng)建 Ant 腳本

    如果你使用 Eclipse 來編寫 Ant,建議使用 Eclipse 3.1 以后的版本。除了以前 Ant 編輯器提供的語法高亮,提示語法錯誤等功能外,Eclipse3.1 版本增加了許多新的功能。比如:腳本代碼的折疊;快速定位某屬性或者目標(target)段的定義;在同一 builder 文件中重構(gòu)屬性名和目標名(快捷方式 Alt + Shift +R);調(diào)試 Ant 腳本等。

    下面我們就來看看 Eclipse 3.1 中對 Ant 的支持

    • 打開“File”-“New”-“Project”-“Simple”-“Project”,點擊“Next”,輸入工程名“Ant”,然后點擊直到“Finish”

    • 在新建的 Ant 工程中,新建 Test.xml,并且拷貝下面的腳本。該段腳本的內(nèi)容就不做介紹了,我們主要看 Eclipse 提供了哪些功能。注意這時候打開的并不是 Ant 編輯器,將內(nèi)容拷貝進去之后,關(guān)掉打開的“Test.xml”,然后再重新打開它,這樣 Eclipse 就會用 Ant 編輯器打開它,并且也語法高亮了。

       <?xml version="1.0" encoding="UTF-8"?> 
       <project name="Test" default="init" basedir="."> 
       <property name="test" value="test"/> 
       <target name="init"> 
      	 <echo>${test}</echo> 
       </target> 
       </project> 
      

    • 自動提示和代碼折疊功能。如果是 Ant 內(nèi)置的命令或者前面已經(jīng)定義的變量,編輯器會自動提示;編輯器右邊的加 / 減號可以代碼折疊。如下所示:

      圖 1:編輯器右邊的加 / 減號可以代碼折疊
    • 快速定位目標(target)或者定義變量處。在上圖中,將鼠標移至 default=”init” 中的 init 上之后,按下 ctrl 鍵,鼠標變成手狀,單擊就可以定位到定義該目標的地方

    • 快速重構(gòu)目標名或者屬性名。選中目標 / 屬性名,按下 Alt + Shift + R,然后鍵入你要修改后的值,所有引用到的地方都會隨之改動。如下圖所示,選中 init 后,按下快捷鍵,改成 initial:

      圖 2:改成 initial
    • 調(diào)試 Ant 腳本。在標簽“<target name=..”的左邊設(shè)置一斷點,然后在編輯器中右擊,出現(xiàn)的菜單中選“Debug As”-“Ant Build”,出現(xiàn)后的窗口與調(diào)試 Java 程序的界面差不多。

      這是調(diào)試窗口,這里可以選擇單步跟進、跳出等:

      圖 3:選擇單步跟進、跳出等

      下面是運行時變量窗口??梢钥吹?test 變量的值是“test”:

      圖 4:test 變量的值是 test

      運行結(jié)果窗口:

      圖 5:運行結(jié)果窗口

    由此可見,如果使用好 Eclipse Ant 編輯器所提供強大的功能的話能大大提高寫 Ant 腳本的效率。


    Ant 中使用 property(屬性)文件

    剛開始寫 Ant 的初學(xué)者可能會把所有的信息都放在 build.xml 中,下面就是這樣的一個例子。

     <project name="testBuild" default="compile" basedir="."> 
     <target name="init"> 
    	 <mkdir dir="c:/temp/dest/testProj" /> 
     </target> 
     <target name="compile" depends="init"> 
    	 <javac srcdir="c:/temp/src/testProj" destdir="c:/temp/dest/testProj "/> 
     <echo>Build into c:/temp/dest/testProj, successfully.</echo> 
     </target> 
     </project> 
    

    在上面的例子中,所有的路徑信息都是寫在 build.xml 中。但是 Ant 腳本可能在不同的機器或者不同的系統(tǒng)上運行,也有可能一些值需要根據(jù)環(huán)境的不同而變化,在 Ant 中可以把所有這些可能變化的地方都放到一個配置文件中,然后在 Ant 腳本中引用這個配置文件就可以了,針對上面的例子,如下所示:

     <project name="testBuild" default="compile" basedir="."> 
    	 <property file="build.properties"/> 
    	 <target name="init"> 
    		 <mkdir dir="${dest.dir}" /> 
    	 </target> 
    	 <target name="compile" depends="init"> 
    		 <javac srcdir="${src.dir}" destdir="${dest.dir}"/> 
    		 <echo>Build into ${dest.dir}, successfully.</echo> 
    	 </target> 
     </project> 
     build.properties 的內(nèi)容:
     dest.dir=c:/temp/dest/testProj 
     src.dir=c:/temp/src/testProj 
    

    如果想在 Ant 腳本中引用值的話,只需用 $ 符號開頭,在一對"{}"中寫入要引用的鍵值。如上例中,需要引用編譯的目標路徑用"${dest.dir}"。


    使用 Ant 任務(wù)從 CVS 中檢出(check out)源代碼,并編譯打包

    Ant 中提供了 cvs 任務(wù)(Task)可以從 CVS 服務(wù)器中檢出資源(注意:在使用 Ant 的 cvs 任務(wù)之前,請先將 cvs.exe 下載到你的機器,并且將它添加到你本地的 PATH 環(huán)境變量中,然后重新啟動 Eclipse。否則在執(zhí)行下面腳本的時候就會得到 error=2 的錯誤)。cvs 的可選用屬性很多,在這里介紹經(jīng)常使用到的幾個屬性。從 CVS 中檢出資源一般需要指定:

    • CVS 所在的服務(wù)器地址:目標 CVS 服務(wù)器地址
    • 用戶名:登錄該 CVS 服務(wù)器你指定的用戶名
    • 密碼:登錄該 CVS 服務(wù)器需要的密碼
    • 庫路徑(Repository Path):服務(wù)器中的庫路徑
    • 模塊名:當(dāng)前需要檢出的模塊名,一般都是以工程的名字作為模塊名
    • 標簽名:需要從 CVS 中檢出哪個標簽

    在介紹使用 Ant 的 cvs 之前,先說一下本地的目錄結(jié)構(gòu)。在 C 盤的 temp 目錄下,分別有四個目錄,如下所示:

    • build 目錄:放編譯后的類以及資源文件
    • dist 目錄:放生成的 jar 文件或者 war 文件
    • lib 目錄:放在編譯過程中需要用到的 jar 文件
    • src 目錄:放從 cvs 中檢出的源文件(包括 JSP 等)
      圖 6:src 目錄

    在 Ant 中這樣寫就可以從中檢出資源:

      <cvs cvsRoot=":pserver:username:pwd@cvs.server:/home/testPath" 
     package="TestProj" dest=" c:/temp/src/testProj " failonerror="true" /> 
    

    這段腳本片斷的意思就是從叫"cvs.server"的服務(wù)器中,用用戶名是 username、密碼為 pwd 的用戶檢出在庫路徑是 /home/testPath 下的 TestProj 模塊(項目),檢出后的資源放入本地目錄 c:/temp/src/testProj 中。在上面這段腳本中,可以看到有很多值可能會根據(jù)不同的環(huán)境或者用戶隨之改變的,比如用戶名和密碼等;而且從腳本的重復(fù)可利用性來說,需要把有些值抽出來放到配置文件中,如服務(wù)器的地址和庫路徑等。因此把這些可能需要更改的地方放到 property 文件中,效果會更好。改完后的完整 Ant 腳本如下所示:

      <?xml version="1.0"?> 
     <project name="testWeb" default="checkout" basedir="."> 
    	 <target name="checkout"> 
    		 <property file="TestWeb.properties" /> 
    		 <cvs cvsRoot="${cvs.root}" package="${cvs.projectName}" 
     tag="${cvs.tag}" dest="${src.dir}" failonerror="true" /> 
    	 </target> 
     </project> 
    

    對應(yīng)的 TestWeb.properties 文件內(nèi)容如下所示:

     base.dir=c:/temp/ 
     src.dir=${base.dir}/src 
    
     cvs.server=cvs.server 
     cvs.user=username 
     cvs.pw=pwd 
     cvs.repositoryPath=/home/testPath 
     cvs.projectName=TestProj 
     cvs.root=:pserver:${cvs.user}:${cvs.pw}@${cvs.server}:${cvs.repositoryPath} 
     cvs.tag= 
    

    在檢出了資源后,需要對其進行編譯打包。為了使 Ant 腳本更加具有可讀性和靈活性,我們需要對上面的 Ant 腳本進行一些改動。首先將 Ant 腳本中進行分段,如下所示:

     <?xml version="1.0"?> 
     <project name="testWeb" default="all" basedir="."> 
    	 <target name="all" depends="init,clean,checkout,build"> 
        <!-- 腳本的入口點 --> 
    	 </target> 
    	 <target name="init"> 
        <!-- 做初始化屬性文件和設(shè)置 classpath 等設(shè)置初始條件 --> 
    	 </target> 
    	 <target name="clean"> 
         <!-- 刪除上一次留下的沒用的目錄和文件 --> 
    	 </target> 
    	 <target name="checkout"> 	
         <!-- 從 CVS 中檢出資源 --> 
    	 </target> 
    	 <target name="build"> 
         <!-- 編譯源文件并打包到指定的目錄 --> 
    	 </target> 
     </project> 
    

    上面的腳本中,總共分成了 5 個目標(target),腳本的入口點是"all",all 按順序調(diào)用 init,clean,checkout,build。其中:

    • init 是用來做初始化屬性文件和設(shè)置 classpath 等設(shè)置初始條件的事情
    • clean 用來刪除上一次留下的沒用的目錄和文件
    • checkout 已經(jīng)介紹過了,是用來從 CVS 中檢出資源
    • build 用來編譯源文件并打 WAR 包到指定的目錄

    詳細的 Ant 腳本可以參見隨本文所附的 TestWeb.xml 和 TestWeb.properties。


    編譯過程與產(chǎn)生不同目標環(huán)境的腳本分開執(zhí)行

    在前面介紹的 Ant 腳本中,根據(jù)從 CVS 服務(wù)器中檢出的資源打成了一個默認的 war 包,并沒有考慮根據(jù)不同的目標環(huán)境來生成不同的包,從下一節(jié)開始介紹如何根據(jù)不同的環(huán)境來生成不同的部署包。

    還有一個問題是:為什么需要把從 CVS 中檢出資源、編譯的過程跟根據(jù)目標環(huán)境打包的過程分開?

    這是因為本身 CVS 檢出資源是需要花一定的時間,如果資源比較多這個過程就會花費挺長時間;另外,在多人開發(fā)的情況下必須保證在生成不同的部署包的時候是用的是同一套代碼生成的,否則會出現(xiàn)各個服務(wù)器上運行的版本不一致,如果檢出資源、編譯的過程跟生成包的腳本一起執(zhí)行的話就會出現(xiàn)這個問題(比如小 A 在測試服務(wù)器測試通過的時候之后,再生成一個在產(chǎn)品環(huán)境下的部署包,如果分兩次從 CVS 服務(wù)器中檢出資源的話,在此期間可能會有開發(fā)人員往 CVS 服務(wù)器中檢入代碼,導(dǎo)致生成的版本不一致),因此,必須將這兩個過程分開執(zhí)行。現(xiàn)在我們開始建立另外一個 Ant 腳本文件,叫 deploy.xml,專門用來生成包;另外與 deploy.xml 相對應(yīng)的還有一個 deploy.properties 文件。在 deploy.xml 中會引用 deploy.properties 文件。另外根據(jù)在前面的場景中碰到的環(huán)境,創(chuàng)建三個不同的屬性文件 , develop_deploy.property、test_deploy. property 和 product_deploy. Property,在打包的時候,根據(jù)不同的目標環(huán)境,將相應(yīng)屬性文件中的內(nèi)容拷貝至 deploy.properties 文件中(或者也可以直接在 deploy.xml 中直接切換不同的屬性文件),然后在 Eclipse 中直接執(zhí)行 deploy.xml;如果在命令行中,可以用下面的命令來執(zhí)行:

      ant – f deploy.xml 
    


    解開 WAR 包

    我們首先得建立一個目錄(這里是 unpack)用來存放解壓后的文件。Ant 中提供了 unzip 命令用來解壓 ear/war/jar 包。除了這個目錄外,根據(jù)不同的目標環(huán)境,在運行目錄下建立一個與目標環(huán)境相對應(yīng)的目錄,重新打好的 war 包就放在這個目錄下,比如針對場景中的情況,如果需要創(chuàng)建一個產(chǎn)品環(huán)境下的部署包,我們可以建立一個 TestWebProduct 目錄,目錄名寫在配置文件中(${pack.base.dir})。

    <target name="init"> 
        <echo>init in deploy</echo> 
        <property file="deploy.properties" /> 
        <delete dir="${unpack.base.dir}" failonerror="false" /> 
        <delete dir="${pack.base.dir}" failonerror="false" /> 
        <mkdir dir="${unpack.base.dir}" /> 
        <mkdir dir="${pack.base.dir}" /> 
    </target> 
    
    <target name="unpack"> 
        <echo>unpack the ${war.name}</echo> 
        <copy file="${dest.dir}/${war.name}" todir="${unpack.base.dir}" />
        <unzip src="${unpack.base.dir}/${war.name}" 
            dest="${unpack.base.dir}/${projectName}" /> 
        <delete file="${unpack.base.dir}/${war.name}" /> 
    </target> 
    

    在 init 段中首先刪除掉上次解壓的目錄和目標打包目錄,然后重新建立目錄;在 unpack 中,首先將編譯好的默認 war 包拷貝至 unpack 定義的目錄,解壓之后把 unpack 下的 war 包刪除。下面是這時候?qū)?yīng)的屬性文件。

     projectName=MTSWeb 
     war.name=MTSWeb.war 
    
     # 根目錄
     base.dir=c:/temp 
     # 默認的 war 包所在的目錄
     dest.dir=${base.dir}/dist 
     # 解壓后的目錄
     unpack.base.dir=${base.dir}/unpack 
     # 目標環(huán)境相對應(yīng)的目錄
     pack.base.dir=${base.dir}/TestWebProduct 
    


    利用 Ant 提供的 filter 任務(wù)替換屬性值

    現(xiàn)在根據(jù)不同環(huán)境的需要,對某些配置文件的值做一些替換。在 Ant 中,提供了 filter 任務(wù),使得替換值很方便。當(dāng)然也可以使用下面介紹的正則表達式來替換屬性值。filter 主要用來在同一行內(nèi)容中的替換,而正則表達式一下子可以替換多行內(nèi)容。filter 的使用例子:

      <filter token=" log4j.logger" value="INFO"/> 
      <copy todir="${dest.dir}" filtering="true"> 
        <fileset dir="${src.dir}"/> 
      </copy> 
    

    這段腳本的意思就是在 src.dir 目錄下的所有文件中,如果有預(yù)先定義好的"@log4j.logger@"占位符的話,在拷貝到 dest.dir 目錄后,所有的占位符都被替換成了"INFO"。

    你也可以將所有被替換的值放到某個屬性文件中,filter 任務(wù)將屬性文件中的每一個條目讀出來并且設(shè)置成一個 Filter。如下所示:

      <filter filtersfile="deploy_env.properties"/> 
      <copy todir="${dest.dir}" filtering="true"> 
        <fileset dir="${src.dir}"/> 
      </copy> 
    

    上面的腳本表示所有在 deploy_env 中出現(xiàn)的條目將被作為一個 filter,在拷貝到 dest.dir 目錄后,所有 src.dir 目錄中存在的占位符將被替換成 deploy_env 中的值。具體的例子可以參見隨本文附帶的 deploy.xml, deploy_env.properties 和 Test.properties。

    其中 deploy.xml 是 ant 腳本,deploy_env.properties 中包含所有要替換的值,在 Test.properties 中是包含有占位符的資源文件。


    利用正則表達式替換屬性值

    Ant 中支持多種正則表達式,在運行 Ant 的時候用哪種正則表達式可以通過設(shè)置 ant.regexp.regexpimpl 的值來切換,Ant 支持的的正則表達式有:

    • java.util.regex package of JDK 1.4
    • jakarta-regexp
    • installation dependencies

    正則表達式的例子:

     <replaceregexp byline="true"> 
     <regexp pattern="正則表達式"/> 
     <substitution expression="將要替換的值"/> 
     <fileset dir="${unpack.war.dir}/WEB-INF" includes="web.xml"/> 
     </replaceregexp> 
    

    byline 屬性用來確認被替換的時候是一次替換一行還是多行;pattern 屬性用來指明正則表達式;substitution expression 中是替換的值,替換的值都定義在相對應(yīng)的配置文件中;fileset 屬性中的 dir 用來指定被替換文件所在的目錄,includes 用來指定要替換哪個文件。需要注意的是,如果在正則表達式或者替換的值中出現(xiàn)"<"的話,需要用轉(zhuǎn)義符"<"。

    在 Eclipse3.1 中已經(jīng)內(nèi)置了對正則表達式的支持;但是如果你在命令行中運行需要正則表達式支持的腳本的話,則需要自己將正則表達式的包下載下來加到 classpath 中。在隨文章的 deploy.xml 中提供了一個簡單的替換屬性文件的值的例子。正則表達式的例子可以在本文所帶的 deploy.xml 中找到。


    Ant 使用條件表達式,根據(jù)屬性值刪除不需要的文件

    在生成部署包的時候,還有可能會根據(jù)目標環(huán)境的不同,刪除一些不同的文件。比如在產(chǎn)品環(huán)境中那些作為測試需要的代碼往往需要刪除,但是測試環(huán)境中并不需要。因此就需要條件表達式來做判斷。如下所示:

     <target name="checkTestEnv"> 
    	 <condition property="isTestEnv"> 
    		 <istrue value="${deploy.isTestEnv}" /> 
    	 </condition> 
    	 <antcall target="trueCondition" /> 
    	 <antcall target="falseCondition" /> 
     </target> 
     <target name="trueCondition" if="isTestEnv"> 
    	 <echo message="true condition in ${projectName}" /> 
     </target> 
     <target name="falseCondition" unless="isTestEnv"> 
    	 <echo message="false condition in ${projectName}" /> 
     </target> 
    

    在上面的例子中,先讀出 ${deploy.isTestEnv} 的值(在配置文件 deloy.properties 中),根據(jù)讀出的值對屬性 isTestEnv 設(shè)值,如果 ${deploy.isTestEnv} 的值是 true,isTestEnv 的值也是 true;否則是 false。然后分別調(diào)用目標段 trueCondition 和 falseCondition。在這里,表達式值的判斷是用"istrue",在 Ant 中還提供了很多別的表達式,比如 not/and/or,equals 等等,具體關(guān)于條件表達式的信息可以參考:http://ant.apache.org/manual/CoreTasks/condition.html,該頁也可以在隨下載下來的文檔中找到。

    在段 trueCondition 中,判斷 isTestEnv,如果是真的話就運行,否則不運行;在段 falseCondition 中,也判斷 isTestEnv,如果是假就運行,否則不運行,在段中可以根據(jù)情況做相應(yīng)的事情。條件判斷式的例子可以在本文的 deploy.xml 中找到。


    重新打包,并拷貝到不同的目錄

    在上面的替換過程完成后,調(diào)用 war 將 unpack 目錄下的內(nèi)容重新打包。

     <target name="repack"> 
    	 <war destfile="${pack.base.dir}/${projectName}.war" 
    		 basedir="${unpack.base.dir}/${projectName}"
    		 webxml="${unpack.base.dir}/${projectName}/WEB-INF/web.xml" 
    		 manifest="${unpack.base.dir}/${projectName}/META-INF/MANIFEST.MF"> 
    	 </war> 
     </target> 
    

    詳細的例子可以參見隨本文的附件 deploy.xml 和 deploy.properties。


    結(jié)論

    通過本文可以看出編寫好有效的 Ant 腳本能很好的解決在編譯部署包的時候出現(xiàn)的問題,將那些變化的內(nèi)容放到配置文件中,在部署的時候切換不同的配置文件就可以實現(xiàn)生成不同的部署包。文中也介紹了如何使用 Eclipse 來提高你編寫 / 調(diào)試 Ant 腳本的效率。

    posted on 2012-04-11 16:06 科菱財神 閱讀(319) 評論(0)  編輯  收藏 所屬分類: Ant


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


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    <2012年4月>
    25262728293031
    1234567
    891011121314
    15161718192021
    22232425262728
    293012345

    統(tǒng)計

    常用鏈接

    留言簿(1)

    隨筆分類

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 黄页网站在线观看免费高清| 又黄又大的激情视频在线观看免费视频社区在线 | 久久久久国产精品免费看| 亚洲日韩乱码中文无码蜜桃臀网站| 四虎成人精品国产永久免费无码| 国产乱子伦精品免费女| 免费人成又黄又爽的视频在线电影| 国产人成免费视频| 一区二区三区免费看| 中文亚洲AV片不卡在线观看| 成人无码a级毛片免费| 我想看一级毛片免费的| 亚洲欧美综合精品成人导航| 日本一区二区三区日本免费| 美女视频黄a视频全免费网站色| 亚洲国产小视频精品久久久三级 | 91嫩草私人成人亚洲影院| 在线精品自拍亚洲第一区| 亚洲av片一区二区三区| 91丁香亚洲综合社区| 午夜两性色视频免费网站| 成人免费ā片在线观看| 狠狠亚洲婷婷综合色香五月排名 | 一本无码人妻在中文字幕免费| 亚洲区小说区激情区图片区 | 69免费视频大片| 亚洲AV无码一区二区二三区入口| 99re免费视频| 亚洲精品乱码久久久久久V | 国产精品久久免费| 亚洲第一极品精品无码久久| 30岁的女人韩剧免费观看| 亚洲中文无码mv| 综合亚洲伊人午夜网 | 国产免费变态视频网址网站| 91成人免费观看在线观看| 亚洲精品国产成人专区| 女人与禽交视频免费看 | 亚洲免费中文字幕| 亚洲AV中文无码字幕色三| 免费观看黄色的网站|