冰浪

          哥已不再年輕 - 堅定夢想,畢生追求!
          posts - 85, comments - 90, trackbacks - 0, articles - 3
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          [原]ANT學習體會

          Posted on 2007-01-23 10:52 冰浪 閱讀(5647) 評論(8)  編輯  收藏 所屬分類: 其它

          這幾天在公司比較閑,所以決定學習ANT的使用,ANT(another neat tool)是一種快速構(gòu)建工具,主要用于java,類似于C++的make。ANT功能很強大,但很易于使用。

          你們一定很奇怪,既然說它易于使用,為什么我要學幾天??呵呵~主要是學習資料不足和自己比較粗心的緣故。

          下面我就先把我自己寫的build.xml文件拿出來,build.xml文件是作為ANT的buildfile,運行ANT命令時,會默認查找當前目錄下的這個文件。
          <!--build.xml start-->

          <project name="MyProject" default="dist" basedir=".">
          ??? <description>
          ??? simple example build file
          ?</description>
          ?<property name="src" location="src"/>
          ?<property name="build" location="build"/>
          ??? <property name="dist" location="dist"/>
          ?<property name="myclasspath" location="WebRoot\WEB-INF\classes"/>

          ??? <property name="lib.dir" location="E:\setup\java\jakarta-tomcat-5.0.28\common\lib"/>
          ?<property name="mylib.dir" location="WebRoot\WEB-INF\lib"/>

          ??? <path id="libAndClass.path">
          ??? <pathelement location="${build}" />
          ??? <fileset dir="${lib.dir}" >
          ?????? <include name="**/*.jar" />
          ??? </fileset>
          ?????? <fileset dir="${mylib.dir}" >
          ?????? <include name="**/*.jar" />
          ??? </fileset>
          ?</path>

          ?<target name="init">
          ?? <tstamp/>
          ?? <mkdir dir="${build}"/>

          ?? <echo message="-1- >> Create the class files directory successful!" />
          ?? <echo message="[mkdir] Created dir:${build}" />
          ?</target>

          ?<target name="compile" depends="init" description="compile the source">
          ?? <javac srcdir="${src}" destdir="${build}">
          ???? <classpath refid="libAndClass.path" />
          ?? </javac>

          ?? <echo message="-2- >> Compile the java source files to the Build directiory successful!" />
          ?? <echo message="[javac] Compiling all source files to ${build}" />
          ?</target>

          ?<target name="dist" depends="compile">
          ?? <mkdir dir="${dist}/lib"/>
          ?? <jar jarfile="${dist}/lib/WebComm-${DSTAMP}.jar" basedir="${build}"/>

          ?? <echo message="-3- >> Create the the project jar file to the Dist directiory successful!" />
          ????? <echo message="[jar] Building jar: ${build}" />
          ?</target>

          ?<target name="clean">
          ?? <delete dir="${build}"/>
          ?? <delete dir="${dist}"/>
          ?</target>

          ?<target name="copyto">
          ?? <copy todir="${myclasspath}">
          ???? <fileset dir="${build}"/>
          ????? </copy>
          ?</target>

          </project>

          <!--build.xml end-->

          這個build.xml的主要用于編譯*.java文件,主要的target(一項任務)是Compile,因為編譯之后還要將之打包,所以將默認target為dist:

          <project name="MyProject" default="dist" basedir=".">

          =>default="dist"

          basedir=".":指明工作路徑為當前目錄。
          按照依賴關(guān)系“depends=targetname”,ANT命令會按init,compile,dist的順序來執(zhí)行這些target。后面的兩個target:clean,copyto并不會執(zhí)行,需要在命令行下輸入:ant targetname的形式才會執(zhí)行,這兩個target的功能是用于刪除class文件的文件夾和將這些class文件拷到WEB-INF\classes下。

          現(xiàn)在主要講講最主要的target:compile,也就是編譯。
          在java源文件中,我們很多時候都需要要導入一些相關(guān)包,所以在用javac編譯這些源文件時,需要加上classpath,因此,在用ANT來編譯時我們也需要要指定這些jar文件路徑,以求順利通過編譯。
          我們在前面先定義好我們需要的classpath:

          <path id="libAndClass.path">
          ??? <pathelement location="${build}" />
          ??? <fileset dir="${lib.dir}" >
          ?????? <include name="**/*.jar" />
          ??? </fileset>
          ?????? <fileset dir="${mylib.dir}" >
          ?????? <include name="**/*.jar" />
          ??? </fileset>
          </path>
          ?
          ?id="libAndClass.path"是指定一個id以方便在target里引用。
          ?
          ?<pathelement location="${build}" />:是讓生成的class類文件也作為以后編譯要用到的相關(guān)類文件。
          ???
          <fileset dir="${lib.dir}" >
          ? <include name="**/*.jar" />
          </fileset>
          是指定本工程項目的WEB-INF\lib下的jar包。

          <fileset dir="${mylib.dir}" >
          ? <include name="**/*.jar" />
          </fileset>
          指定tomcat下的公共庫。

          完成后就直接在compile的target里引用:
          <javac srcdir="${src}" destdir="${build}">
          ?<classpath refid="libAndClass.path" />
          </javac>

          注意,在這里,引用是用refid=idname方式,不然不能正常工作。我就是因為把refid誤換成localtion,所以一直不能編譯成功。

          以上是我在學習ANT中的一些體會,并不是ANT教程,所以沒有講得很細,但看過ANT的基礎(chǔ)知識后再看我寫的這篇文章,應該就很好理解了,希望對初學者有點幫助。


          評論

          # re: [原]ANT學習體會  回復  更多評論   

          2007-01-23 11:49 by samfree[匿名]
          這幾天也正好用到ant,便琢磨了一下.遇到了一個問題,向摟主請教一下.
          ant的時候,我們需要把cvs下tag文件 copy到j(luò)ar包里,問題是如果tag文件
          不存在的話,就自動生成一個tag,寫上當前日期.在tag里該怎樣判斷文件的存在呢?

          # re: [原]ANT學習體會  回復  更多評論   

          2007-01-23 12:01 by 冰浪
          @samfree[匿名]

          我不是很明白你要表達的意思,能說清楚點嗎?
          給你一個例子,不知能否幫到你:
          <condition property="abc.efg">
          <and>
          <available file="abc.js" filepath="d:/"/>
          </and>
          </condition>

          <target name="your-task" if="abc.efg">
          <echo>${abc.efg}</echo>
          </target>

          根據(jù)d:/abc.js文件是否存在來決定your-task任務的執(zhí)行與否。

          # re: [原]ANT學習體會  回復  更多評論   

          2007-01-23 14:51 by samfree[匿名]
          多謝冰浪,你給的例子非常好,正是我要用的。
          <condition property="exist.tag">
          <and>
          <available file="Tag" filepath="CVS/"/>
          </and>
          </condition>
          <target name="copy" if="exist.tag">
          <copy file="CVS/Tag" todir="./"/>
          </target>
          <target name="nocopy" unless="exist.tag" depends="copy">
          <java classname="com.ruanying.pub.Tag">
          <classpath>
          <pathelement location="${build}"/>
          </classpath>
          </java>
          </target>
          如果cvs/tag存在,就把它copy到當前目錄下。如果不存在就創(chuàng)建一個tag文件
          ,并把當前日期寫入。我不知道用ant怎么往文件里寫東西,所以就調(diào)用了一個
          類來寫東西。不知你有什么別的方法嗎?

          # re: [原]ANT學習體會  回復  更多評論   

          2007-01-23 15:31 by 冰浪
          @samfree[匿名]

          ANT在文件系統(tǒng)操作中有一替換文件的標記:
          <replace file="input.txt" token="old" value="new"/>
          它執(zhí)行文件中的查找和替換操作。token 屬性指定要查找的字符串,value 屬性指定一個新的字符串,查找到的標記字符串的所有實例都被替換為這個新的字符串。

          按你的要求,把token屬性指定為“”,就是空字符串,然后value屬性指定為你要寫入的當前日期,不知這樣是否可以實現(xiàn)?

          # re: [原]ANT學習體會  回復  更多評論   

          2007-01-23 23:27 by 小車馬
          ant非常的簡潔,一直用它,呵呵

          樓主,潛力貼論壇(http://content.uu1001.com)是我個人的一個設(shè)想,如果你對java非常的專注,并且愿意交我這個朋友,可以發(fā)郵件給我(lbw070105@gmail.com),希望我們可以一起發(fā)展它。

          # re: [原]ANT學習體會  回復  更多評論   

          2007-01-24 10:47 by samfree[匿名]
          謝謝冰浪,問題已經(jīng)解決了.

          # re: [原]ANT學習體會  回復  更多評論   

          2007-02-28 15:51 by chin
          感謝冰浪的例子,不過我想判斷一個目錄是否存在,不知道該怎么做。望指教。

          # re: [原]ANT學習體會  回復  更多評論   

          2008-01-19 11:05 by wanlu
          請教一個問題,我想用ant寫一個判斷語句,判斷是否存在某一個目錄,若存在則執(zhí)行target A , 若不存在則執(zhí)行target B ,幫我看一下我寫的是不是對的?

          <project name="test" default="testB" basedir=".">
          <property name="desturl" value="build/2008/01"/>
          <condition property="folderexist">
          <and>
          <available file="${desturl}" type="dir"/>
          </and>
          </condition>
          <target name="testA" if="folderexist">
          <echo message="the folder was exist!"/>
          </target>
          <target name="testB" unless="folderexist" depends="testA">
          <echo message="the folder was not exist"/>
          </target>
          </project>



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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 肥乡县| 大冶市| 常熟市| 武功县| 依兰县| 庐江县| 东乌珠穆沁旗| 莱西市| 松阳县| 北辰区| 碌曲县| 德格县| 巢湖市| 西乌珠穆沁旗| 常德市| 布尔津县| 仲巴县| 三河市| 日土县| 旌德县| 镇远县| 麻阳| 沛县| 瑞昌市| 揭西县| 通海县| 永川市| 紫阳县| 福海县| 秀山| 聂拉木县| 子洲县| 孝感市| 新乡市| 济宁市| 桐乡市| 铁岭市| 城固县| 沾化县| 南宫市| 龙州县|