轉載自: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>