ant中copy操做學習心得(轉)

Ant真是太方便了,之前都沒注意到它。功能很強大,能建立數據庫,配置服務器,部署發佈應用……只須要寫好build.xml文件,剩下的就交給ant來「安裝」你的WEB應用了。

Appfuse的第一個ant命令是ant new,其任務是創建一個新命名的project,少不了會複製不少文件。build.xml中也有不少copy操做,爲了搞清楚ant new到底幹了些什麼事,仍是先把copy操做了解一下。看了會ant的DOCS,網上也找了些文章,發現copy這部分都是一帶而過,講得很淺,因而我就只有本身實驗下,發現還有點收穫。 ant版本爲1.6.5。

1. 拷貝單個文件到指定目錄下。html

<copy todir="${basedir}/new" file="${basedir}/old/old1.txt1"> 

將${basedir}/old/old.txt文件拷貝到${basedir}/new下

2. 拷貝一批文件到指定目錄下java

      <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/>子屬性表示排除,很簡單,經過他們組合實現多文件的篩選,固然我這個例子用得很傻。好比數據庫

                <include name="appgen/**"/>
                <include name="ibatis/**"/>
                <exclude name="**/*.log"/>

      拷貝appget目錄和ibatis目錄下除了.log文件之外的其它全部文件和子目錄。

      能夠把<fileset/>簡寫成<fileset dir="${basedir}/old" includes="old1.txt,old2.txt" />,includes能夠理解成include的複數形式,包含多個文件時用逗號隔開,excludes也同樣。

3. 拷貝一個目錄到指定目錄下服務器

       <copy todir="${basedir}/new">
           <fileset dir="${basedir}/old">
             <include name="appgen" />
             <include name="appgen/" />
             <include name=appgen/**" />
             <include name="appgen/***" />
           </fileset>
       </copy>

      一樣使用<fileset/>屬性,name指定目錄名,不過這裏要分兩種狀況,用<include/>子屬性和不用<include/>子屬性.
      若使用<include/>, 又要分三種狀況
          如果「appgen」,則只會拷貝名爲appgen的空目錄過去,它裏面的文件和子目錄則不會拷貝。
          如果「appgen/」,或「appgen/**」,則會把整個appgen目錄拷貝過去,包括裏面的文件和子目錄。
          如果「appgen/*」,則只會把該目錄和該目錄下第一級子目錄的全部東西拷貝過去,而不會拷貝第二級和第二級如下的。注:「appgen/*」這兒是一個*號,*號若大於兩個,也跟一個*號是一樣效果。好比「appgen/*」和「appgen/****」都只拷貝appgen目錄下第一級子目錄。

注:若appeng這個目錄自己就是個空目錄,不管怎麼寫,這個空目錄都不會被拷貝。也就是說,copy操做不會產生建立空目錄的做用,要想建立空目錄,只有用mkdir。

      若不使用任何<include>屬性,如app

           <fileset dir="${basedir}/old">
           </fileset>

      則會拷貝${basedir}/old下的全部文件和子目錄。

注:使用<exclude/>排除目錄時,目錄名必須寫成「appgen/」或「appgen/**」形式,不然不會生效。

      以上是三種拷貝到目錄的種類,注意若是計算機中沒有todir指定的路徑,ant將會自動建立這個路徑。

4. 拷貝單個的文件: ui

<copy tofile="old.txt" file="new.txt" />

就這麼簡單就好了。spa


固然也能夠寫成.net

  <copy tofile="${basedir}/new/new.txt">
     <fileset dir="${basedir}/old" includes="old.txt" />
  </copy>

      這裏includes就只能寫一個文件,不能寫上多個文件,由於不能將多個文件複製到一個文件中去,因此這樣麻煩的寫法是沒有意義的。

      複製確定還要涉及到同名覆蓋的問題,ant在copy類的API中說明:Files are only copied if the source file is newer than the destination file,這裏的newer是指文件的修改時間,即便你在修改時文件內容沒有任何變化,只是致使修改時間變了,ant一樣會覆蓋同名文件,也就是說,ant不會檢查文件內容。

      對因而複製目錄的狀況,因爲目錄沒有修改時間,ant仍是經過檢查目錄內文件的修改時間來決定是否覆蓋的,若目錄內某文件修改時間有變化,則會覆蓋這個文件,而不是整個目錄。

若是要強行覆蓋,<copy/>有個overwrite屬性,默認爲false,改爲true就好了。code

轉自 http://www.blogjava.net/hh-lux/archive/2009/04/07/86635.htmlxml

相關文章
相關標籤/搜索