Ant 實戰(zhàn)篇 (一)

???????????????????????????????????????????????????????????????????????????? 修訂者: 黃 凱 ?? ?????

E_mail: hk_sz@163.com

前 言

由于現(xiàn)在公司進(jìn)行Unit Test Case的整理階段,所以抽空對Ant和Junit技術(shù)進(jìn)行了一下了解,以下是集合了眾家所長之精華(考慮到是按我的思路總結(jié)的,也許不能完全表述原作者的思路,所以在參考中我把所有參考過的文章網(wǎng)址或書籍都羅列了出來,大家有時間不妨去看看原文)。

如果對Ant部分參數(shù)不明白的話,請參看《Ant理論篇》系列或ant自帶的文檔。

?

目 錄

一、?Ant?使用實例?

???
1.1 ?通過?Ant?的?copt?task?將當(dāng)前目錄下最近更新的文件(按系統(tǒng)時間來區(qū)分)文件提交至指定目錄
???
1.2
?用?Ant?開發(fā)?java?程序?
????
1.3
?ant?結(jié)合?junit?進(jìn)行軟件自動測試?
? ??
1.4
?ant?開發(fā)和部署?web?應(yīng)用程序?
????
1.5
?ant?打包(?jar?)?應(yīng)用程序?
???
1.6
?ant?開發(fā)?EJB?應(yīng)用程序?
參考

?

一、 Ant 使用實例

1.1 通過 ?Antcopt task 將當(dāng)前目錄下最近更新的文件(按系統(tǒng)時間來區(qū)分)文件提交至指定目錄?
?1?
前提:在D盤下創(chuàng)建兩個文件夾test1和test2,并在test1中創(chuàng)建build.xml文件,內(nèi)容如下:

<? xml?version = " 1.0 " ?>??
<?project?name?="?test?"?default?="?upload?">?

???
<!--?設(shè)置提交的根路徑以及提交目錄屬性?-->??
???
<?property?name?="?dest_drive?"?value?="?D:\?"?/>??
???
<?property?name?="?dest_dir?"?value?="?${dest_drive}\test2\test?"?/>

???
<!--?如果沒有提交目錄的話,創(chuàng)建提交目錄?-->??
???
<?target?name?="?create_dir?">??
???????
<?mkdir?dir?="?${dest_dir}?"?/>??
???
</?target?>?

???
<!--?通過copy?task提交當(dāng)前目錄下除build.xml外所有非臨時文件?-->??
???
<?target?name?="?upload?"?depends?="?create_dir?">??
???????
<?copy?todir?="?${dest_dir}?">??
??????????
<?fileset?dir?="?.?">??
?????????????
<?exclude?name?="?**\build.xml?"/>??
??????????
</?fileset?>??
???????
</?copy?>??
???
</?target?>??
</?project?>?



2>進(jìn)入DOS命令行狀態(tài),運行D:\test1>ant。進(jìn)入test2中進(jìn)行檢查,看是否已經(jīng)建立好了test子目錄并且將test1中的文件除build.xml外都已經(jīng)提交過來。如果這時你再運行ant,會發(fā)現(xiàn)其沒有任何操作提示,因為已經(jīng)沒有新文件需要提交了。

注:有興趣的朋友不妨將其中一個文件更新一下再執(zhí)行一次,你會發(fā)現(xiàn) upload: 下會出現(xiàn)新的信息。


1.2 用Ant開發(fā)java程序,以HelloWord為例

1. 本次實例的目錄結(jié)構(gòu):
?D:\test?主目錄
????
--
\src??源程序目錄
????
--
\classes?編譯后的class文件目錄

?? 首先在D盤創(chuàng)建test目錄和src子目錄。
2. 在src子目錄下創(chuàng)建HelloWord.java文件,內(nèi)容如下:
public ? class ?HelloWord
{
????
public ? static ? void ?main(String?args[])
????
{
????????System.out.println(
" Hello?World! " );
????}

}

3.在test主目錄下創(chuàng)建build.xml文件,內(nèi)容如下:

<? xml?version = " 1.0 " ?>
< project? default = " build " ?basedir = " . " > ?

???
< property?name = " appname " ?value = " HelloWord " ? />
???
< property?name = " base " ?value = " D:\test " ? />
???
< property?name = " src " ?value = " src " ? />
???
< property?name = " build " ?value = " classes " ? />
???
< property?name = " myclasspath " ?value = " ${base}\${build} " ? /> ?

???
< target?name = " build " >
???????
< mkdir?dir = " ${build} " ? />
???????
< javac?srcdir = " ${src} " ?destdir = " ${build} " >
???????????
< include?name = " **/*.java " ? />
???????
</ javac >
???
</ target > ?

???
< target?name = " run " ?depends = " build " >
???????
< exec?executable = " java " >
???????????
< arg?line = " ?-classpath?${myclasspath}?${appname} " ? />
???????
</ exec >
???
</ target > ?

???
< target?name = " clean " >
???????
< delete?includeEmptyDirs = " true " >
???????????
< fileset?dir = " ${build} " ? />
???????
</ delete >
???
</ target > ?

</ project >

為了提高程序的可移植性,我們將property分離出來組成build.properties文件。新的build.xml文件和build.properties文件內(nèi)容如下:



build.properties文件:

appname = HelloWord
src
= src
build
= classes
myclasspath
= $ {basedir} \\$ {build} ?

build.xml文件(property部分通過file調(diào)用build.properties即可):

<? xml?version = " 1.0 " ?>
< project? default = " build " ?basedir = " . " >
?
???
< property?file = " build.properties " ? /> ?

???
< target?name = " build " >
???????
< mkdir?dir = " ${build} " ? />
???????
< javac?srcdir = " ${src} " ?destdir = " ${build} " >
???????????
< include?name = " **/*.java " ? />
???????
</ javac >
???
</ target > ?

???
< target?name = " run " ?depends = " build " >
???????
< exec?executable = " java " >
???????????
< arg?line = " ?-classpath?${myclasspath}?${appname} " ? />
???????
</ exec >
???
</ target > ?

???
< target?name = " clean " >
???????
< delete?includeEmptyDirs = " true " >
???????????
< fileset?dir = " ${build} " ? />
???????
</ delete >
???
</ target > ?

</ project > ?

4. 在test目錄下運行ant查看執(zhí)行結(jié)果。
再運行ant run和ant clean看看會怎么樣,:)

?

1.3 ant 結(jié)合 junit 進(jìn)行軟件自動測試

1> 用ant結(jié)合junit啟動基本編譯和測試的自動過程如下:

★ 執(zhí)行 JUnit 測試

★ 捕獲測試結(jié)果,將結(jié)果記錄到 XML 文件或其它格式的文件

★ 將結(jié)果轉(zhuǎn)化為基于 XSL 格式的測試報告

★ 將這個報告轉(zhuǎn)化為 HTML 格式

★ 用電子郵件發(fā)送報告

???? 一旦捕獲結(jié)果,就可以使用XML格式化器將每個測試套件運行的故障和錯誤數(shù),連同軟件包和類名還有測試套件的執(zhí)行時間一起引入。對于每個測試套件,都有以下信息被捕獲:

☆ 測試案例的名稱

☆ 執(zhí)行的持續(xù)時間

☆ 故障或錯誤的類型(如果適用)

☆ 任何故障或錯誤的詳細(xì)信息

2> 本次實例的目錄結(jié)構(gòu):

D:\car?? 主目錄

???? \src???? 源程序目錄

???? \classes編譯后的class文件目錄

???? \etc???? 其他

???????? \xsl???? XSL文件目錄

首先在D盤創(chuàng)建car目錄、src子目錄和etc子目錄,并從%ANT_HOME%\etc下拷貝junit-noframes.xsl文件至D:\car\etc\xsl子目錄下。

3> 從 http://download.sourceforge.net/junit/junit3.8.zip 下載,解壓至D盤,將其目錄下的junit.jar文件拷貝至%ANT_HOME%\lib目錄下。

4> 在src子目錄下新建Car.java以及testCar.java文件。

Car.java的內(nèi)容如下:

//將要被測試的類

public class Car

{

??? public int getWheels()

??? {

??????? return 3;

??? }

}

testCar.java的內(nèi)容如下:

//執(zhí)行測試的類

import junit.framework.*;

?

public class testCar extends TestCase

{

??? protected int expectedWheels;

??? protected Car myCar;

???

??? public testCar(String name)

??? {

??????? super(name);

??? }

???

??? protected void setUp()

??? {

??????? expectedWheels = 4;

??????? myCar = new Car();

??? }

???

??? public static Test suite()

??? {

??????? return new TestSuite(testCar.class);

??? }

???

??? public void testGetWheels()

??? {

??????? assertEquals(expectedWheels, myCar.getWheels());

??? }

}

5> 在build.xml和build.properties文件。

buil.properties文件內(nèi)容如下:

src.dir=src

build.dir=classes

xsl.dir=etc/xsl

report.dir=report

build.xml文件內(nèi)容如下:

<?xml version="1.0"?>
<project default="build" basedir=".">
?
?? ?<property file="build.properties" description="Transfer property from .properties file"/>

?? ?<target name="build" description="Build the work directory">
?? ???? <mkdir dir="${build.dir}" />
?? ???? <mkdir dir="${report.dir}" />
?? ???? <javac srcdir="${src.dir}" destdir="${build.dir}">
?? ???????? <include name="**/*.java" />
?? ???? </javac>
?? ?</target>
??
?? <target name="junit" depends="build"? description="Execute Unit Tests">
??????? <tstamp/>
??<junit printsummary="yes">
???<classpath>
??? ???<pathelement location="${build.dir}"/>
??? ?</classpath>

????? ??<formatter type="xml" />
???? ?<batchtest todir="${report.dir}">
?????? ??<fileset dir="${src.dir}">
????????? ??<include name="**/testCar.java" />
?? ????</fileset>
????? ??</batchtest>
??? ?</junit>

??? ?<junitreport todir="${report.dir}">
????? ??<fileset dir="${report.dir}">
??????? ??<include name="TEST-*.xml"/>
????? ??</fileset>
????? ??<report format="noframes" styledir="${xsl.dir}" todir="${report.dir}"/>
??? ?</junitreport>
??? </target>

?<target name="clean" description="Delete the work directory">
?? ??<delete includeEmptyDirs="true">
?????? ???? <fileset dir="${build.dir}"/>
?????? ???? <fileset dir="${report.dir}"/>
????? ?</delete>
? ?</target>

</project>

6> 在D:\car目錄下運行ant junit,

這樣在car\report中生成了 junit-noframes.html 、TESTS-TestSuites.xml和TEST-testCar.xml文件,打開junit-noframes.html查看結(jié)果。運行ant clean恢復(fù)原狀。


?

1.4 ant 開發(fā)和部署 web 應(yīng)用程序

1> 前提:

★ 完成《JBuilder9+Weblogic7實戰(zhàn)篇之Filter運用篇》,因為這是我們這次打包的實例;

★ 將Filter整個目錄拷貝至D盤,我是用Jbuilder編輯的,所以除classes文件夾和Filter.war文件刪除外,其他的保留,我們要用到的相關(guān)目錄結(jié)構(gòu)如下:

D:\Filter

???? src java源文件目錄

???? Filter?? JSP文件及配置文件目錄

???????? WEB-INF? 配置文件目錄

2> 由于不是在Jbuilder環(huán)境進(jìn)行編譯,所以需要在CLASSPATH中定義servlet的路徑。首先,我們到

http://java.sun.com/products/servlet/download.html

下載

http://java.sun.com/webapps/download/Redirect/103537442/5847479377282807053505607246086069333228938
633594669477228720286350602472859339008063305596058473206-4908/servlet-2_3-fcs-classfiles.zip

然后將包含servlet-2_3-fcs-classfiles.zip的整個路徑加到CLASSPATH中。

3> 在D:\Filter目錄下創(chuàng)建build.properties和Filter.xml文件。

build.properties文件內(nèi)容如下:

WebLogic.user_projects.mydomain.applications=C:/bea/user_projects/mydomain/applications

filter=Filter

dest=classes.ant

src=src

Filter.xml文件內(nèi)容如下:

<?xml version="1.0"?>
<project default="init" basedir=".">
?
?? ?<property file="build.properties"/>

?? ?<target name="init" description="initialization">
?? ???? <mkdir dir="${dest}" />
?? ???? <javac destdir="${dest}">
?? ???????? <src path="${src}"/>
?? ???? </javac>
?? ?</target>

?<target name="war" depends="init">
?? ??<war destfile="Filter.war" webxml="${filter}/WEB-INF/web.xml" compress="false">
????? ??<classes dir="${dest}">
??????? ??<include name="**/*.*"/>
????? ??</classes>
????? ??<fileset dir="${filter}">
??????? ??<include name="**/*.*"/>
????? ??</fileset>
????? ?</war>
?? ?</target>
?? ?
?? ?<target name="deploy" depends="war">
?? ??<copy todir="${WebLogic.user_projects.mydomain.applications}">
???? ?<fileset dir="." includes="Filter.war"/>
??? ?</copy>
?? ?</target>
?? ?
?? ?<target name="rebuild" depends="clean,war">
?? ??<copy todir="${WebLogic.user_projects.mydomain.applications}">
???? ?<fileset dir="." includes="Filter.war"/>
??? ?</copy>
?? ?</target>????
????

?<target name="clean">
?? ??<delete includeEmptyDirs="true">
?????? ???? <fileset dir="${dest}"/>
?????? ???? <fileset dir=".">
?????? ???? ?<include name="Filter.war"/>
?????? ???? </fileset>
?????? ???? <fileset dir="${WebLogic.user_projects.mydomain.applications}">
?????? ???????? <include name="Filter.war"/>
?????? ???? </fileset>
????? ?</delete>
? ?</target>

</project>

4> 啟動Weblogic server,在D:\Filter目錄下運行ant deploy -buildfile Filter.xml進(jìn)行部署,打開IE,
在地址欄輸入http://localhost:7001/Filter/login.jsp查看是否能正常運行。然后,你可以修改Filter子目錄下的login.jsp文件中的代碼,
運行ant rebuild -buildfile Filter.xml重新部署,然后刷新http://localhost:7001/Filter/login.jsp查看顯示修改后的結(jié)果是否正確。

5> 以上第3步是將web應(yīng)用程序通過拷貝到%BEA_HOME%\user_projects\mydomain\applications目錄下進(jìn)行部署的,
其實ant提供了對應(yīng)于Weblogic的發(fā)布任務(wù)<serverdeploy>。請用下面代碼替換掉build.properties和Filter.xml文件中的代碼。

build.properties文件內(nèi)容如下:

WebLogic.user_projects.mydomain.applications=C:/bea/user_projects/mydomain/applications

filter=Filter

dest=classes.ant

src=src

weblogic.server=C:/bea/weblogic700/server

username=training

user.password=training

weblogic.filter=C:/bea/user_projects/mydomain/myserver/upload/Filter

Filter.xml文件內(nèi)容如下:

<?xml version="1.0"?>
<project default="init" basedir=".">
?
?? ?<property file="build.properties"/>

?? ?<target name="init" description="initialization">
?? ???? <mkdir dir="${dest}" />
?? ???? <javac destdir="${dest}">
?? ???????? <src path="${src}"/>
?? ???? </javac>
?? ?</target>

?<target name="war" depends="init">
?? ??<war destfile="Filter.war" webxml="${filter}/WEB-INF/web.xml" compress="false">
????? ??<classes dir="${dest}">
??????? ??<include name="**/*.*"/>
????? ??</classes>
????? ??<fileset dir="${filter}">
??????? ??<include name="**/*.*"/>
????? ??</fileset>
????? ?</war>
?? ?</target>
?? ?
?? ?<target name="deploy" depends="war">
?? ??<serverdeploy action="deploy" source="Filter.war">
???????? <weblogic application="Filter"
????????? server="t3://127.0.0.1:7001"
????????? classpath="${weblogic.server}/lib/weblogic.jar"
????????? username="${username}"
????????? password="${user.password}" ?
????????? component="Filter:myserver"????
???? ???? debug="true"/>
??????? </serverdeploy>
?? ?</target>
?? ?
?? ?<target name="redeploy" depends="war">
?? ??<serverdeploy action="update" source="Filter.war">
???????? <weblogic application="Filter"
????????? server="t3://127.0.0.1:7001"
????????? classpath="${weblogic.server}/lib/weblogic.jar"
????????? username="${username}"
????????? password="${user.password}" ?
????????? component="Filter:myserver"????
???? ???? debug="true"/>
??????? </serverdeploy>
?? ?</target>
?? ?
?? ?<target name="list">
?? ??<serverdeploy action="list">
???????? <weblogic application="Filter"
????????? server="t3://127.0.0.1:7001"
????????? classpath="${weblogic.server}/lib/weblogic.jar"
????????? username="${username}"
????????? password="${user.password}"???
???? ???? debug="true"/>
??????? </serverdeploy>
?? ?</target>
?? ?
?? ?<target name="undeploy">
?? ??<serverdeploy action="undeploy">
???????? <weblogic application="Filter"
????????? server="t3://127.0.0.1:7001"
????????? classpath="${weblogic.server}/lib/weblogic.jar"
????????? username="${username}"
????????? password="${user.password}"???
???? ???? debug="true"/>
??????? </serverdeploy>
?? ?</target>
?? ?
?? ?<target name="delete">
?? ???? <serverdeploy action="delete" source="Filter.war">
???????? <weblogic application="Filter"
????????? server="t3://127.0.0.1:7001"
????????? classpath="${weblogic.server}/lib/weblogic.jar"
????????? username="${username}"
????????? password="${user.password}"/>
??????? </serverdeploy>
??? </target>????

?<target name="clean">
?? ??<delete includeEmptyDirs="true">
?????? ???? <fileset dir="${dest}"/>
?????? ???? <fileset dir="${weblogic.filter}"/>
?????? ???? <fileset dir=".">
?????? ???? ?<include name="Filter.war"/>
?????? ???? </fileset>
?????? ???? <fileset dir="${WebLogic.user_projects.mydomain.applications}">
?????? ???????? <include name="Filter.war"/>
?????? ???? </fileset>
????? ?</delete>
? ?</target>

</project>
6> 啟動Weblogic server,在D:\Filter目錄下運行ant deploy -buildfile Filter.xml進(jìn)行部署, 打開 IE,在地址欄輸入 http://localhost:7001/console/ 后在左邊的單擊

mydomain\deployments\Web Applications\Filter
,然后在右邊單擊“ deploy ”選項欄,查看是否部署成功。
開一個IE,在地址欄輸入http://localhost:7001/Filter/login.jsp
看是否能正常運行。接下來運行ant undeploy -buildfile Filter.xml進(jìn)行取消部署,
刷新 http://localhost:7001/console/ 瀏覽器,查看部署是否成功取消。

?? 然后,你可以修改Filter子目錄下的login.jsp文件中的代碼, 再運行 ant redeploy -buildfile Filter.xml 進(jìn)行重新部署, 再刷新 http://localhost:7001/console/ 瀏覽器,查看
部署是否成功。

?? 然后刷新http://localhost:7001/Filter/login.jsp查看顯示修改后的結(jié)果是否正確。

?? 最后,從Web Applications中刪除Filter,運行ant delete -buildfile Filter.xml進(jìn)行刪除。 刷新 http://localhost:7001/console/ 的瀏覽器,查看是否成功(在左邊的單擊
mydomain\deployments\Web Applications
)。