編程之道

          無論是批評(píng)的,贊揚(yáng)的,指著的都請(qǐng)EMAIL給我,你的建議將是我前進(jìn)的動(dòng)力! 聯(lián)系我

          [轉(zhuǎn)]用Ant來打包

          21.3? Ant 來打包

          Eclipse 內(nèi)置了 Ant Ant 是一種類似于批處理程序的軟件包,它主要繁瑣的工作是編寫和調(diào)試自動(dòng)處理腳本(一個(gè) XML 文件),但只要有了這個(gè)腳本,我們就可以一鍵完成所有的設(shè)定工作。

          本節(jié)還是以 myswt 這個(gè)應(yīng)用程序項(xiàng)目的打包為例,用 Ant 來完成“編譯->打成 JAR 包->復(fù)制項(xiàng)目引用庫->復(fù)制本地化文件 swt-win32-3063.dll ->輸出 API 文檔”這五步。

          1 、在 myswt 項(xiàng)目根目錄下,創(chuàng)建最主要的 build.xml 文件

          <? xml?version="1.0" ?>

          < project? name ="myswt?project" ?default ="api_doc" >

          ????
          <!-- ?定義目錄變量? -->

          ????
          < property? name ="src.dir" ?value ="src" ? />

          ????
          < property? name ="bin.dir" ?value ="bin" ? />

          ????
          < property? name ="eclipse_plugins.dir" ?value ="c:/eclipse/plugins" ? />

          ????
          < property? name ="dist.dir" ?value ="d:/dist" ? />

          ????
          < property? name ="doc.dir" ?value ="${dist.dir}/api" ? />

          ????
          < property? name ="swt.dll" ?value ="swt-win32-3063.dll" ? />

          ????
          <!-- ?定義編譯文件時(shí)所引用的庫? -->

          ????
          < path? id ="master-classpath" >

          ????????
          < fileset? dir ="${eclipse_plugins.dir}" ?id ="project_lib" >

          ????????????
          < include? name ="org.eclipse.ui.workbench_3.0.1/workbench.jar" />

          ????????????
          < include? name ="org.eclipse.swt.win32_3.0.1/ws/win32/swt.jar" />

          ????????????
          < include? name ="org.eclipse.jface_3.0.0/jface.jar" />

          ????????????
          < include? name ="org.eclipse.osgi_3.0.1/osgi.jar" />

          ????????????
          < include? name ="org.eclipse.osgi_3.0.1/core.jar" />

          ????????????
          < include? name ="org.eclipse.osgi_3.0.1/resolver.jar" />

          ????????????
          < include? name ="org.eclipse.osgi_3.0.1/defaultAdaptor.jar" />

          ????????????
          < include? name ="org.eclipse.osgi_3.0.1/eclipseAdaptor.jar" />

          ????????????
          < include? name ="org.eclipse.osgi_3.0.1/console.jar" />

          ????????????
          < include? name ="org.eclipse.core.runtime_3.0.1/runtime.jar" />

          ????????????
          < include? name ="org.eclipse.jface.text_3.0.1/jfacetext.jar" />

          ????????????
          < include? name ="org.eclipse.ui.workbench.compatibility_3.0.0/compatibility.jar" />

          ????????
          </ fileset >

          ????
          </ path >



          ????
          <!-- ?首任務(wù)(空) -->

          ????
          < target? name ="init" />

          ????
          <!-- ?編譯? -->

          ????
          < target? name ="compile" ?depends ="init" >

          ????????
          < delete? dir ="${bin.dir}" />

          ????????
          < mkdir? dir ="${bin.dir}" />

          ????????
          <!-- 編譯源程序 -->

          ????????
          < javac? srcdir ="${src.dir}" ?destdir ="${bin.dir}" ?target ="1.4" >

          ????????????
          < classpath? refid ="master-classpath" />

          ????????
          </ javac >

          ????????
          <!-- 復(fù)制圖標(biāo)目錄 -->

          ????????
          < mkdir? dir ="${bin.dir}/icons" />

          ????????
          < copy? todir ="${bin.dir}/icons" >

          ????????????
          < fileset? dir ="icons" />

          ????????
          </ copy >

          ????
          </ target >

          ????
          <!-- ?打包? -->

          ????
          < target? name ="pack" ?depends ="compile" >

          ????????
          <!-- ?bin目錄壓縮成JAR包? -->

          ????????
          < delete? dir ="${dist.dir}" />

          ????????
          < mkdir? dir ="${dist.dir}" ? />

          ????????
          < jar? basedir ="${bin.dir}" ?destfile ="${dist.dir}/myswt.jar" ?manifest ="ant_manifes.txt" >

          ????????????
          < exclude? name ="**/*Test.*" ? />

          ????????????
          < exclude? name ="**/Test*.*" ? />

          ????????
          </ jar >

          ????????
          <!-- ?復(fù)制用到的庫? -->

          ????????
          < mkdir? dir ="${dist.dir}/lib" ? />

          ????????
          < copy? todir ="${dist.dir}/lib" >

          ????????????
          < fileset? refid ="project_lib" />

          ????????
          </ copy >

          ????????
          <!-- ?復(fù)制本地化文件? -->

          ????????
          < copy? todir ="${dist.dir}" ?file ="${swt.dll}" />

          ????
          </ target >

          ????
          <!-- ?輸出api文檔? -->

          ????
          < target? name ="api_doc" ?depends ="pack" >

          ????????
          < delete? dir ="${doc.dir}" />

          ????????
          < mkdir? dir ="${doc.dir}" ? />

          ????????
          < javadoc? destdir ="${doc.dir}" ?author ="true" ?version ="true" ?use ="true" ?windowtitle ="MySWT?API" >

          ????????????
          < packageset? dir ="${src.dir}" ?defaultexcludes ="yes" />

          ????????????
          < doctitle > <![CDATA[ <h1>MySWT?Project</h1> ]]> </ doctitle >

          ????????????
          < bottom > <![CDATA[ <i>Document?by?ChenGang?2005.</i> ]]> </ bottom >

          ????????
          </ javadoc >

          ????
          </ target >

          </ project >



          代碼說明:

          1 property 項(xiàng)是定義變量,比如 <property name="swt.dll" value="swt-win32-3063.dll" /> ,就是定義一個(gè)變量: swt.dll=swt-win32-3063.dll 。以后用這個(gè)變量則是這樣: ${swt.dll} 。

          一般盡量將今后可能會(huì)變動(dòng)的目錄、文件等定義成變量,以方便維護(hù)。不象 Java 變量有類型的區(qū)分, Ant 變量是不區(qū)別目錄、文件等的,所以為了見名知意,在取變量名時(shí),目錄都加“ dir ”后綴,這個(gè)后綴是可以任取名的。

          下面給出本例用到的變量的含義:

          l?????????? src.dir Java 源文件路徑。 value="src" src 是一個(gè)相對(duì)路徑,它相對(duì)的是 build.xml 的所在目錄位置(即項(xiàng)目根目錄)。

          l?????????? bin.dir Java 編譯文件的輸出路徑

          l?????????? eclipse_plugins.dir eclipse plugins 目錄

          l?????????? dist.dir 打包文件的存放目錄

          l?????????? doc.dir API 文檔的存放目錄,這里用到了 dist.dir 變量,直接寫 value="d:/dist/api" 也未嘗不可。

          l?????????? swt.dll SWT 本地化文件。

          2 <path id="master-classpath"> ,定義編譯文件時(shí)所引用的庫,相當(dāng)于 classpath 。 <fileset> 項(xiàng)表示一個(gè)文件集,再深入一層的 <include> 項(xiàng),則表示此文件集下的文件,它們的路徑定位相對(duì)于 <fileset> dir 屬性。 <fileset> 還有一個(gè) id 屬性,在后面復(fù)制引用庫時(shí)會(huì)用到。

          也許有讀者會(huì)問:“你是怎么知道要引用這些文件的?”回答:看項(xiàng)目根目錄下的“ .classpath ”文件,就可以知道本項(xiàng)目要引用那些庫了。實(shí)際上筆者是把 .classpath 復(fù)制一份后,然后用 Editplus 編輯而得。

          3 )接下來開始定義一些任務(wù)。首任務(wù)一般都讓它為空(沒有具體任務(wù)內(nèi)容): <target name="init"/> 。

          4 Ant 中的任務(wù)有著相互的依賴( depends )關(guān)系,這些依賴關(guān)系是通過 depends 屬性來定義的。當(dāng)要執(zhí)行一個(gè)任務(wù)時(shí), Ant 先去執(zhí)行這個(gè)任務(wù)的 depends 任務(wù),……, Ant 就這樣一直往回找下去。比如:在本例的第二行 default="api_doc" ,它定義了缺省任務(wù)是 api_doc (輸出 api 文檔)->此任務(wù)的 depends = pack (打包)-> pack depends = compile (編譯)-> compile depends=init (首任務(wù)), init 沒有 depends 。于是, Ant 就從 init 開始依次往回執(zhí)行任務(wù): init -> compile -> pack -> api_doc 。

          如果你不想“輸出 api 文檔”,則將第二行的缺省任務(wù)定義成 default="pack" 即可,這時(shí)整個(gè)任務(wù)鏈就拋開了 api_doc

          5 <delete dir="${bin.dir}"/> 刪除目錄。 <mkdir dir="${bin.dir}"/> 新建目錄

          6 )編譯源程序,如下

          <javac srcdir="${src.dir}" destdir="${bin.dir}" target="1.4">

          ??? <classpath refid="master-classpath"/>

          </javac>

          l?????????? srcdir 源文件目錄,其子目錄中的源文件也會(huì)被 javac.exe 編譯。

          l?????????? destdir 編譯文件輸出目錄。

          l?????????? target JDK1.4 為編譯目標(biāo)。

          l?????????? classpath 編譯的 classpath 設(shè)置, refid 是指引用前面設(shè)定的 master-classpath 。

          7 )將 icons (即 myswt/icons )目錄的文件,復(fù)制到 myswt/bin/icons 目錄中,如下:

          <copy todir="${bin.dir}/icons">

          ??? <fileset dir="icons"/>

          </copy>

          8 )將文件打成 JAR

          <jar basedir="${bin.dir}" destfile="${dist.dir}/myswt.jar" manifest="ant_manifes.txt">

          ??? <exclude name="**/*Test.*" />

          ??? <exclude name="**/Test*.*" />

          </jar>

          l?????????? basedir 源目錄。

          l?????????? destfile 目標(biāo)目錄和打成 JAR 包名。

          l?????????? manifest 打包清單文件(后面給出其內(nèi)容)。

          l?????????? exclude 使用了通配符將某一些文件排除不打包(主要是一些測(cè)試文件)。

          9 )如下,將 project_lib 的文件復(fù)制到 d:/dist/lib 目錄中。 project_lib 是前面“定義編譯文件時(shí)所引用的庫”中的文件集的 id 。結(jié)果參數(shù)下圖 21.25

          <copy todir="${dist.dir}/lib">

          ??? <fileset refid="project_lib"/>

          </copy>

          10 )將本地化文件復(fù)制到 d:/dist 目錄中,如下:

          <copy todir="${dist.dir}" file="${swt.dll}"/>?

          11 )輸出 API 文檔(結(jié)果參數(shù)下圖 21.26

          <javadoc destdir="${doc.dir}" author="true" version="true" use="true" windowtitle="MySWT API">

          ??? <packageset dir="${src.dir}" defaultexcludes="yes"/>

          ??? <doctitle><![CDATA[<h1>MySWT Project</h1>]]></doctitle>

          ??? <bottom><![CDATA[<i>Document by ChenGang 2005.</i>]]></bottom>

          </javadoc>

          l?????????? destdir 目標(biāo)路徑 d:/dist/api

          l?????????? packageset 源文件目錄

          l?????????? doctitle 標(biāo)題

          l?????????? bottom 標(biāo)尾。

          2 、創(chuàng)建打包清單

          為了避免和原來的 manifes.txt 同名,在項(xiàng)目根目錄建立一個(gè)名為 ant_manifes.txt 的文件。這個(gè)文件內(nèi)容中最長的是 Class-Path 項(xiàng),沒有必要一個(gè)個(gè)字符的敲入,它可以由項(xiàng)目根目錄下的“ .classpath ”編輯而得。


          -----------------------------------------------------------------
          一片很不錯(cuò)的文章
          http://dev.csdn.net/article/72718.shtm

          posted on 2005-09-26 14:14 瘋流成性 閱讀(338) 評(píng)論(0)  編輯  收藏 所屬分類: 轉(zhuǎn)貼區(qū)

          主站蜘蛛池模板: 南城县| 抚州市| 和平区| 闻喜县| 遂平县| 呼图壁县| 游戏| 崇仁县| 康乐县| 沂源县| 旺苍县| 南郑县| 双鸭山市| 胶州市| 东山县| 南京市| 石狮市| 神农架林区| 扬中市| 巨鹿县| 九龙县| 简阳市| 建德市| 施甸县| 镇平县| 肇州县| 哈密市| 商河县| 视频| 长垣县| 吉隆县| 文成县| 景泰县| 林口县| 嘉鱼县| 水富县| 竹北市| 黑龙江省| 余姚市| 瑞金市| 余江县|