maven項目antrun插件打包時拷貝文件用法


轉載自:http://hi.baidu.com/laihua2006/blog/item/e54e113956f12932b9998f44.html

ant copy 復制文件


在用Ant部署時,出現:“警告: 編碼 GBK 的不可映射字符”,網上找了一下,主要是編碼兼容性的問題,需要個javac指定編碼,於是在build.xml中加入以下說明即可:


<target name="compile" depends="prepare" description="編繹">
   <javac srcdir="${src.dir}" destdir="${build.classes.dir}" debug="on" deprecation="on" optimize="off" includes="**">
    <!--給編譯器指定編碼,防止出現:"警告: 編碼 GBK 的不可映射字符"-->
  <compilerarg line="-encoding UTF-8 "/>  
    <classpath refid="build.classpath" />
   </javac>
</target>


 


1. 拷貝單個文件到指定目錄下。
例:<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/>子屬性表示排除,很簡單,通過他們組合實現多文件的篩選,當然我這個例子用得很傻。比如
                <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>屬性,如
           <fileset dir="${basedir}/old">
           </fileset>
       則會拷貝${basedir}/old下的所有文件和子目錄。


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


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


4. 拷貝單個的文件: 
〈copy tofile="old.txt" file="new.txt" /〉就這么簡單就行了。
當然也可以寫成
<copy tofile="${basedir}/new/new.txt">
      <fileset dir="${basedir}/old" includes="old.txt" />
   </copy>
       這里includes就只能寫一個文件,不能寫上多個文件,因為不能將多個文件復制到一個文件中去,所以這樣麻煩的寫法是沒有意義的。


Copy Task的屬性及功能


Copy 任務具有以下屬性:


(1)file:用於指定要復制的源文件。


(2)preservelastmodified:作用是使得復制后的文件與源文件的最后修改時間相同。默認為false。


(3)tofile:用於指定要復制到的文件。


(4)todir:用於指定要復制到的目標目錄。todir和tofile只能使用其中一個屬性。


(5)overwrite:用於指定是否需要覆蓋目錄和文件,不管文件是否比源文件新,都會覆蓋。默認為false。


(6)filtering:用於指定在復制時是否使用構件文件的全局過濾器對文件進行過濾。默認為false。


(7)flatten:用於指定是否需要復制目錄,如果為true代表把所有的文件復制到todir屬性設定的目錄下。默認為false,復制目錄。


(8)includeEmptyDirs:用於指定是否復制空目錄。默認為true。


(9)failonerror:用於指定當遇到錯誤時是否停止執行。默認為true。


(10)verbose:用於指定當復制文件時是否記錄日志信息。


(11)encoding:用於設定復制文件時的編碼或文件過濾器使用的編碼方式。默認時使用Java虛擬機的編碼方式。


(12)outputencoding:指定寫文件時的編碼方式。默認時使用Java虛擬機的編碼方式。


(13)enablemultiplemappings:用於設定是否允許多個映射。默認為false。


(14)granularity:用於指定一個文件修改時間的毫秒數據的允許誤差。因為不是所有的文件系統的修改時間都是精確到毫秒數。默認時為0,如果為DOS系統則為2。


 


在執行Copy Task時使用文件過濾的實例


下面是一個復制文件的同時替換文件中的特殊符號的例子:


<copy todir="../backup/dir">


    <fileset dir="src_dir"/>


    <filterset>


      <filter token="TITLE" value="Foo Bar"/>


    </filterset>


</copy>


這個例子的作用是把src_dir目錄下的所有文件復制到../backup/dir目錄,並在所有文件中查找並替換@TITLE@為Foo Bar。當要進行新產品發布時通過需要替換文件中的版本信息和時間信息。


說明:在Ant工具中還提供了copydir和copyfile這兩個特定的任務,分別用於對目錄和文件進行復制。但自從有了Copy任務后,這兩個任務已過期,不建議再使用,應該統一使用Copy任務。


小例:從工作空間復制到Tomcat 里面去


<?xml version="1.0" encoding="UTF-8"?>
<project name="" default="lch" basedir=".">
    <property name="db_file_dir" value="C:/Users/Administrator/workspace/gdagri/WebRoot/WEB-INF/classes/gznxt/database/"/>
    <property name="row_file_dir" value="C:/Users/Administrator/workspace/gdagri/WebRoot/WEB-INF/classes/gznxt/entity/"/>
    <property name="to_db_dir"  value="D:/tool/apache-tomcat-5.5.26/webapps/gdnyw/WEB-INF/classes/gznxt/database/"/>
    <property name="to_row_dir" value="D:/tool/apache-tomcat-5.5.26/webapps/gdnyw/WEB-INF/classes/gznxt/entity/"/>
    <!--  每次本地編譯到服務器里面時,不要忘記重啟服務器Tomcat  下面是農運通的  laefage -->
    <target name="lch_1" >
            <copy todir="${to_row_dir}">
                <fileset dir="${row_file_dir}">
                    <include name="TransportGoodsRow.class"/>
                    <include name="TransportCartRow.class"/>
                </fileset>
            </copy>
        </target>
    
    <target name="lch" >
        <copy todir="${to_db_dir}" overwrite="true">
            <fileset dir="${db_file_dir}">
                <include name="TransportCartDB.class"/>
                <include name="TransportGoodsDB.class"/>
            </fileset>
        </copy>
    </target>
    
</project>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM