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