<?xml version="1.0" encoding="UTF-8" ?>
<project name="ecp-oracle" basedir="." default="copyProjectToTomcat">
<property name="src" value="src"/>
<property name="dest" value="web/WEB-INF/classes"/>
<property name="build" value="../build"/>
<property name="project" value="ecp-oracle"/>
<property name="tomcat.webapp.dir" value="F:/apache-tomcat-6.0.29/webapps"/>
<property name="tomcat.project" value="*.war"/>
<property name="tomcat.dir" value="F:/apache-tomcat-6.0.29"/>
<!-- 指定編譯所依賴的jar-->
<path id="project.classpath">
<fileset dir="web/WEB-INF/lib">
<include name="*.jar"/>
</fileset>
</path>
<target name="init">
<tstamp/><!-- 生成時間戳 -->
<delete dir="${dest}" />
<mkdir dir="${dest}" />
<delete dir="${build}" />
<mkdir dir="${build}" />
<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpath="svnant.jar"/><!-- 使用svn的支持 這裏就要求svnant.jar在系統classpath中 -->
</target>
<target name="copy" depends="init">
<copy todir="${dest}">
<fileset dir="src/conf/"/>
</copy>
<!-- svn更新代碼 -->
<target name="update" depends="init">
<svn username="pengch" password="123456">
<update dir="../${project}"/>
</svn>
</target>
</target>
<target name="compile" depends="copy">
<javac srcdir="${src}" destdir="${dest}" encoding="UTF-8">
<classpath refid="project.classpath"/>
</javac>
</target>
<target name="copy2" depends="compile">
<copy todir="${build}">
<fileset dir="web/"/>
</copy>
</target>
<target name="build" depends="copy2">
<jar jarfile="${project}-${DSTAMP}.war" basedir="${build}"/>
</target>
<target name="clean" depends="build">
<delete dir="${dest}"/>
<delete dir="${build}"/>
</target>
<!-- 拷貝項目到tomcat的webapps中 -->
<target name="copyProjectToTomcat" depends="clean">
<delete dir="${tomcat.webapp.dir}/${tomcat.project}" />
<copy todir="${tomcat.webapp.dir}/" file="${project}-${DSTAMP}.war"/>
</target>
<!-- 停止tomcat -->
<target name="stopTomcat">
<exec dir="${tomcat.dir}/bin" executable="cmd.exe" os="Windows XP">
<arg line="/c shutdown.bat" />
</exec>
</target>
<!-- 啓動tomcat -->
<target name="startTomcat">
<exec dir="${tomcat.dir}/bin" executable="cmd.exe" os="Windows XP">
<arg line="/c startup.bat" />
</exec>
</target>
</project>
通過網上的資料以及自己的測試實踐做出的第一個ant應用,這個應用的作用主要是完成支持svn更新項目、項目的打包及發佈到tomcat服務器部署運行。
關於其每一句的詳情解析在這就不廢話了,因爲之前轉載了一篇適合初學者的ant實例有對每一句的詳情講解,在這就記錄下我一步步下來遇到的一些問題及解決(注:我的項目是java project):
1、字符編碼問題:javac編譯時報“GBK不可映射字符”和“非法字符/65279”錯誤
GBK不可映射字符:<javac srcdir="${src}" destdir="${dest}" encoding="UTF-8"> 在此指定字符編碼爲“UTF-8”即可
非法字符/65279:用editplus打開所報文件 Document--File Encoding--Change File Encoding 此亦可選擇多文件字符編碼更改File Encoding Multiple修改爲“UTF-8”保存即可
2、用ant編譯時指定讀取需要的項目lib下的jar包,所以需要配置classpath指定jar包的路徑
設置classpath的方法有多種
<path id="project.classpath">
1<pathelement path="${basedir}/lib/aa.jar"/>
2<pathelement location="aa.jar"/>與1的區別在於location可以去當前路徑,當然可以使用絕對路徑
3<filelist id="file" dir="${basedir}/lin">
<file name="a.jar"/>
<file name="d:lib/b.jar"/>
</filelist>
4<fileset dir="d:/lib">
<include name="**/*.jar"/>
</fileset>
</path>
下面說classpath的使用
樣例如下
<javac scdir="./src" destdir="./classes">
<classpath refid="project.classpath"/>
</javac>
下面是比較四種方式的優缺點
第一種調用的需要設置絕對路徑適合第三方jar包
第二種則適合jar包和build.xml文件在同一目錄下的情況,但是我覺得兩個文件放在一起本身就不合理,估計是用的情況不多。
前兩個都是設置單個jar包
第三種是一個文件集合適合引入不同路徑的jar包,但是需要輸入每個jar包的名字,比較繁瑣,適合於jar包屬於不同位置,比較分散但是不多的情況
第四種是一個文件夾,可以採用匹配模式來引入,這個適合在同一個文件夾下,文件名字比較多的情況下
3、打war包時追加當前時間命名文件( 生成時間戳):
這種需要是通過簡單但是非常有用的 tstamp 任務來解決的。這個任務通常在某次生成過程開始時調用,比如在一個 init 目標中。這個任務不需要屬性,許多情況下只需 <tstamp/> 就足夠了。
tstamp 設置的屬性:
屬性 說明 例子
DSTAMP 設置爲當前日期,默認格式爲yyyymmdd 20031217
TSTAMP 設置爲當前時間,默認格式爲hhmm 1603
TODAY 設置爲當前日期,帶完整的月份 2003年12月17日
將JAR文件將命名爲package-20031217.jar
<jar destfile="package-${DSTAMP}.jar" basedir="classes"/>
還可以配置 tstamp 任務來設置不同的屬性,應用一個當前時間之前或之後的時間偏移,或以不同的方式格式化該字符串。所有這些都是使用一個嵌套的 format 元素來完成的,如下所示:
<tstamp>
<format property="OFFSET_TIME"
pattern="HH:mm:ss"
offset="10" unit="minute"/>
</tstamp>
上面的清單將OFFSET_TIME 屬性設置爲距離當前時間 10分鐘之後的小時數、分鐘數和秒數。
用於定義格式字符串的字符與 java.text.SimpleDateFormat 類所定義的那些格式字符相同。
4、使用svn的支持:
1>、ant本身需要svnant任務插件支持,才能在ant腳本中獲取svn中的內容,svnant是subclipse的組件之一,它的URL 是:
http://subclipse.tigris.org/svnant.html
2>、使用前需要將它依賴的類庫放在ant安裝目錄下面的lib目錄;
3>、要想使用svnant中的任務訪問svn的話,首先要定義新的task:
<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpath="svnant.jar" /> <!-- 這裏就要求svnant.jar在系統classpath中 -->
5、最後就是啓動tomcat及停止tomcat.