Thinking in sky

          --老賀的BLOG

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            21 隨筆 :: 0 文章 :: 35 評(píng)論 :: 0 Trackbacks

          Ant真是太方便了,以前都沒(méi)注意到它。功能很強(qiáng)大,能創(chuàng)建數(shù)據(jù)庫(kù),配置服務(wù)器,部署發(fā)布應(yīng)用……只需要寫(xiě)好build.xml文件,剩下的就交給ant來(lái)“安裝”你的WEB應(yīng)用了。

          Appfuse的第一個(gè)ant命令是ant new,其任務(wù)是建立一個(gè)新命名的project,少不了會(huì)復(fù)制很多文件。build.xml中也有很多copy操作,為了搞清楚ant new到底干了些什么事,還是先把copy操作了解一下。看了會(huì)ant的DOCS,網(wǎng)上也找了些文章,發(fā)現(xiàn)copy這部分都是一帶而過(guò),講得很淺,于是我就只有自己實(shí)驗(yàn)下,發(fā)現(xiàn)還有點(diǎn)收獲。 ant版本為1.6.5。

          1. 拷貝單個(gè)文件到指定目錄下。
          例:<copy todir="${basedir}/new" file="${basedir}/old/old1.txt1">
          將${basedir}/old/old.txt文件拷貝到${basedir}/new下

          2. 拷貝一批文件到指定目錄下
          例:<copy todir="${basedir}/new">
          ???????????<fileset dir="${basedir}/old">
          ??????????????<include name="old1.txt" />
          ??????????????<include name="old2.txt" />
          ????????????? <exclude name="old8.txt" />
          ????????? </fileset>
          ?????? </copy>
          ????? 這里fileset定義的是原文件的組成形式,<include/>子屬性表示包括,<exclude/>子屬性表示排除,很簡(jiǎn)單,通過(guò)他們組合實(shí)現(xiàn)多文件的篩選,當(dāng)然我這個(gè)例子用得很傻。比如
          ??????????????? <include name="appgen/**"/>
          ??????????????? <include name="ibatis/**"/>
          ??????????????? <exclude name="**/*.log"/>
          ????? 拷貝appget目錄和ibatis目錄下除了.log文件以外的其它所有文件和子目錄。

          ??????可以把<fileset/>簡(jiǎn)寫(xiě)成<fileset dir="${basedir}/old" includes="old1.txt,old2.txt" />,includes可以理解成include的復(fù)數(shù)形式,包含多個(gè)文件時(shí)用逗號(hào)隔開(kāi),excludes也一樣。

          3. 拷貝一個(gè)目錄到指定目錄下
          例:<copy todir="${basedir}/new">
          ???????????<fileset dir="${basedir}/old">
          ?????????????<include name="appgen" />
          ???????????? <include name="appgen/"?/>
          ???????????? <include name=appgen/**" />
          ???????????? <include name="appgen/***" />
          ???????????</fileset>
          ???????</copy>
          ??????同樣使用<fileset/>屬性,name指定目錄名,不過(guò)這里要分兩種情況,用<include/>子屬性和不用<include/>子屬性.
          ????? 若使用<include/>, 又要分三種情況
          ????????? 若是“appgen”,則只會(huì)拷貝名為appgen的空目錄過(guò)去,它里面的文件和子目錄則不會(huì)拷貝。
          ????????? 若是“appgen/”,或“appgen/**”,則會(huì)把整個(gè)appgen目錄拷貝過(guò)去,包括里面的文件和子目錄。
          ????????? 若是“appgen/*”,則只會(huì)把該目錄和該目錄下第一級(jí)子目錄的所有東西拷貝過(guò)去,而不會(huì)拷貝第二級(jí)和第二級(jí)以下的。注:“appgen/*”這兒是一個(gè)*號(hào),*號(hào)若大于兩個(gè),也跟一個(gè)*號(hào)是同樣效果。比如“appgen/*”和“appgen/****”都只拷貝appgen目錄下第一級(jí)子目錄。

          注:若appeng這個(gè)目錄本身就是個(gè)空目錄,無(wú)論怎么寫(xiě),這個(gè)空目錄都不會(huì)被拷貝。也就是說(shuō),copy操作不會(huì)產(chǎn)生創(chuàng)建空目錄的作用,要想創(chuàng)建空目錄,只有用mkdir。

          ??????若不使用任何<include>屬性,如
          ?????????? <fileset dir="${basedir}/old">
          ?????????? </fileset>
          ??????則會(huì)拷貝${basedir}/old下的所有文件和子目錄。

          注:使用<exclude/>排除目錄時(shí),目錄名必須寫(xiě)成“appgen/”或“appgen/**”形式,否則不會(huì)生效。

          ??????以上是三種拷貝到目錄的種類(lèi),注意如果計(jì)算機(jī)中沒(méi)有todir指定的路徑,ant將會(huì)自動(dòng)創(chuàng)建這個(gè)路徑。

          4. 拷貝單個(gè)的文件:
          〈copy?tofile="old.txt" file="new.txt" /〉就這么簡(jiǎn)單就行了。
          當(dāng)然也可以寫(xiě)成
          ? <copy tofile="${basedir}/new/new.txt">
          ?????<fileset dir="${basedir}/old" includes="old.txt" />
          ??</copy>
          ??????這里includes就只能寫(xiě)一個(gè)文件,不能寫(xiě)上多個(gè)文件,因?yàn)椴荒軐⒍鄠€(gè)文件復(fù)制到一個(gè)文件中去,所以這樣麻煩的寫(xiě)法是沒(méi)有意義的。



          ??????復(fù)制肯定還要涉及到同名覆蓋的問(wèn)題,ant在copy類(lèi)的API中說(shuō)明:Files are only copied if the source file is newer than the destination file,這里的newer是指文件的修改時(shí)間,即使你在修改時(shí)文件內(nèi)容沒(méi)有任何變化,只是導(dǎo)致修改時(shí)間變了,ant同樣會(huì)覆蓋同名文件,也就是說(shuō),ant不會(huì)檢查文件內(nèi)容。

          ??????對(duì)于是復(fù)制目錄的情況,由于目錄沒(méi)有修改時(shí)間,ant還是通過(guò)檢查目錄內(nèi)文件的修改時(shí)間來(lái)決定是否覆蓋的,若目錄內(nèi)某文件修改時(shí)間有變化,則會(huì)覆蓋這個(gè)文件,而不是整個(gè)目錄。

          如果要強(qiáng)行覆蓋,<copy/>有個(gè)overwrite屬性,默認(rèn)為false,改成true就行了。

          posted on 2006-12-10 04:54 老賀 閱讀(21860) 評(píng)論(5)  編輯  收藏 所屬分類(lèi): J2EE框架

          評(píng)論

          # re: ant中copy操作學(xué)習(xí)心得 2007-07-11 16:28 hyl
          怎么將當(dāng)前目錄下嵌套在各級(jí)目錄下的所有的source目錄拷貝整合在一個(gè)新建的文件夾里呢  回復(fù)  更多評(píng)論
            

          # re: ant中copy操作學(xué)習(xí)心得 2007-07-13 16:07 hyl
          如何象Windows底下查找SRC目錄,并將這些目錄合并成一個(gè)新的SRC目錄
          我想這也是通過(guò)copy來(lái)實(shí)現(xiàn)的,但做了很多實(shí)驗(yàn),都沒(méi)辦法完成查找相應(yīng)的目錄并合并他們?nèi)缦拢?
          1. 從指定的一個(gè)目錄下 ,查找 src 目錄
          2. 將這些src 目錄合并到一個(gè) src 目錄
          3. 如果 src 目錄下含有 “java” 這個(gè)目錄,那么將java 目錄下包含的文件及其目錄移動(dòng)到 src 目錄下

          期待和您一起探討

          我的郵箱xinzi_815@163.com  回復(fù)  更多評(píng)論
            

          # re: ant中copy操作學(xué)習(xí)心得 2008-07-22 13:55 ckckck
          <copy todir="newsrc" flatten="true">
          <fileset dir=".">
          <include name="**/src/**"/>
          </fileset>
          </copy>@hyl
            回復(fù)  更多評(píng)論
            

          # re: ant中copy操作學(xué)習(xí)心得 2009-04-07 18:12 雷蒙磨
          我是直接跑到路徑下拷貝的,正在想辦法直接拷貝整個(gè)的文件夾。  回復(fù)  更多評(píng)論
            

          # re: ant中copy操作學(xué)習(xí)心得 2013-06-17 17:18 akingseu
          總結(jié)得非常到位,尤其是文件覆蓋時(shí)不檢查內(nèi)容,只檢查同名文件的修改時(shí)間,這個(gè)很nice  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 吐鲁番市| 黄骅市| 边坝县| 容城县| 广德县| 石河子市| 马公市| 周至县| 旌德县| 凤凰县| 成都市| 于田县| 隆尧县| 凌海市| 七台河市| 龙岩市| 永嘉县| 乾安县| 海宁市| 邢台县| 绥德县| 江北区| 沛县| 河池市| 大洼县| 长白| 琼结县| 虎林市| 宜州市| 忻州市| 资兴市| 永泰县| 鹿泉市| 台南市| 铜山县| 老河口市| 乌苏市| 玉山县| 萨嘎县| 富蕴县| 舟曲县|