在上篇博文
《ant的下載與安裝——mybatis學習筆記之預備篇(一)》中,筆者介紹了ant的下載與安裝。本文將介紹如何使用ant建立一個簡單的工程,作為ant的入門樣本。
在這裡首先和大家分享一下筆者學習新技術的一點心得。每一項技術都會涉及到很多的知識點,這很容易對初學者造成較大的心理壓力。如果剛開始把目標定得過高,寫較複雜的程式的話,會有一個很大的壞處:因為是初學,基礎知識掌握得並不牢固,也缺乏經驗,犯錯誤的幾率更大。那麼此時這個不牢固的基礎知識以及經驗的匱乏,自然會給排錯增加很大的困難,因為你有太多的不確定。這不但耽誤時間,而且對自信心也是一個打擊,至少會加劇自己的心理壓力。然而,如果只是用它寫一個較小的程式的話,實際上只會用到其中很小一部分的知識。這樣出錯後(這是不可避免的),不確定的地方也較少,排錯也容易。因此,筆者的做法通常是先寫出一個簡單的程式,通過這個過程,先牢固掌握最基本的知識並開始積累經驗。然後,再以此為基礎,逐漸擴大編寫程式的複雜度(這樣跨度小)。這樣出錯後,由於先前的知識和經驗的積累,以及較小的跨度,排錯的難度自然大大降低。這樣就可以減輕心理壓力,逐漸樹立自信,比較容易地逐步掌握越來越多的知識。因此,本文以及後續的博文都會貫徹同一條原則:從最簡單的開始,逐漸增加複雜度。本文就先介紹如何編寫一個簡單的ant工程,以後mybatis的學習筆記,都用ant來組織工程。
存放ant工程所有的檔案需要一個目錄,筆者在自己機器上的E:\DemoPrograms下建立一個目錄AntDemo,用來建立本文的ant工程,其他所有的目錄都以此目錄為基準。在此目錄下需要有三個子目錄,它們是src、lib和classes,其作用分別如下:
src:存放原始碼檔案和工程所需的設定檔;
lib:工程用到的jar包;
classes:編譯後的.class檔案被輸出到此目錄,工程所需的設定檔也會被複製到此目錄下(在後面我們可以看到,實際上這個目錄我們可以讓ant幫我們建立)。
本樣本將建立一個User對象,並把它以JSON字串的形式輸出(有關JSON的知識,讀者可參考http://www.json.org)。程式非常簡單,純屬樣本。User類是一個簡單的JAVA Bean,代碼如下:
package com.abc.people;
publicclass User {
privateint id;
private String name;
privateint age;
private String gender;
publicint getId() {
return id;
}
publicvoid setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
publicvoid setName(String name) {
this.name = name;
}
publicint getAge() {
return age;
}
publicvoid setAge(int age) {
this.age = age;
}
public String getGender()
{
return gender;
}
publicvoid setGender(String gender)
{
this.gender = gender;
}
}
依據此類的package聲明,在src下建立子目錄com\abc\people(包的層次與與目錄層次一一對應),把User.java檔案存放在此目錄下。然後是建立User對象並轉換為JSON字串的程式,在這裡是AntDemo類,代碼如下:
package com.demo;
import com.abc.people.User;
import net.sf.json.JSONObject;
publicclass AntDemo
{
publicstaticvoid main(String[] args)
{
User user = new User();
user.setId(10);
user.setName("General Patton");
user.setAge(60);
user.setGender("male");
//建立一個JSONObject對象
JSONObject json = JSONObject.fromObject(user);
//以JSON字串的形式列印
System.out.println(json.toString());
}
}
與User.java類似,我們根據AntDemo所在的包,在src目錄下建立目錄com\demo,用來存放AntDemo.java檔案。本樣本需要用到的jar包如下:commons-beanutils-1.8.3.jar,commons-collections-3.2.1.jar,commons-lang-2.6.jar,commons-logging-1.1.1.jar,ezmorph-1.0.6.jar,json-lib-2.4-jdk15.jar。自然,我們需要把這些jar包複製到lib目錄下。
接下來需要做的,就是建立ant工程的核心所在,編寫組建檔案。組建檔案預設名為build.xml,一般存放在工程的頂級目錄中,在本樣本中就是在AntDemo下。組建檔案包含一個project元素,它是頂級元素,代表一個工程。project元素至少一個target元素,而每個target元素又包含一個到多個task元素。執行ant,就是執行這些target元素;而執行每個target元素,就是依次執行它所包含的task元素。本工程的build.xml檔案如下:
<?xmlversion="1.0"encoding="ISO-8859-1"?>
<!--project元素。name屬性指定工程的名稱,default屬性
指定ant預設執行的target,即不指定要執行的target時,ant
執行的target。basedir指定本工程的基準目錄,這裡指定為
目前的目錄。-->
<projectname="AntDemo"default="compile"basedir=".">
<!--property元素,定義了兩個元素,供後面以${元素名}的形式引用。-->
<propertyname="targetdir"value="classes"/>
<propertyname="srcdir"value="src"/>
<!--定義一個path元素,指定id屬性,供後面引用-->
<pathid="library">
<!--定義一個fileset元素,用於指定需要用到的檔案。dir屬性指定哪個目錄下的檔案。-->
<filesetdir="lib">
<!--指定包含lib目錄下的所有jar包-->
<includename="*.jar"/>
</fileset>
</path>
<!--定義一個target元素,name屬性為必須,用於標識此target。description屬性用於描述此target,無太大意義。depends屬性指定執行此target,所依賴的其他target。這裡指定為了運行compile這個target,需首先執行clean,copy-resources這兩個target。-->
<targetname="compile"description="Compiles the Task"depends="clean">
<!--javac是ant的核心任務(task),用於編譯JAVA來源程式。srcdir屬性指定來源程式所在的目錄,${srcdir}表明引用上面定義的名為srcdir的property元素的值。destdir指定編譯後產生的.class檔案的輸出目錄。同樣地,這裡使用了${targetdir}的形式引用了上面定義的名為targetdir的property元素的值。classpathref表明引用上面定義的id為library的path元素。在這裡,即可把它包含的.jar包載入到classpath中,而不需要像筆者以前那樣自己手動運行setclasspath命令。-->
<javacsrcdir="${srcdir}"destdir="${targetdir}"
classpathref="library"includeantruntime="no"/>
</target>
<!--定義一個名為clean的target。-->
<targetname="clean">
<!--delete是ant的一個核心任務,用於刪除目錄或文
件。這裡用來刪除classes目錄。即先把以前建立的classes目錄刪除,免得舊檔案造成幹擾-->
<deletedir="${targetdir}"/>
<!--mkdir也是一核心任務,用於建立目錄。這裡用來
新建立classes目錄-->
<mkdirdir="${targetdir}"/>
</target>
<targetname="copy-resources">
<!--copy也是ant的一個核心任務,用於複製目錄或文
件。todir指定複製的目標目錄。本樣本未使用此任務-->
<copytodir="${targetdir}">
<!--fileset元素指定要複製的檔案集,dir屬性指定複製的來源目錄,exclude元素指定排除此目錄下的所有java源檔案,即複製除這些檔案之外的所有檔案-->
<filesetdir="${srcdir}">
<excludename="**/*.java"/>
</fileset>
</copy>
</target>
<!--depends屬性指定運行此target應先運行名為compile的target-->
<targetname="run"depends="compile">
<!--java是ant的核心任務,用於執行某個java類。classname屬性用於指定要啟動並執行類,這裡要用到類的全名fork設為true表明使用另外的JVM來運行我們的JAVA類,而不是使用運行ant的那個JVM。classpathref與上面的javac裡的一樣-->
<javafork="true"classname="com.demo.AntDemo"classpathref="library">
<!--將classes目錄載入到classpath中-->
<classpathpath="${targetdir}"/>
</java>
</target>
</project>
開啟命令列視窗,進入到E:\DemoPrograms\AntDemo目錄下。若直接執行ant命令,ant將在目前的目錄下搜尋build.xml檔案(這是預設情況),並根據project元素的default值,執行compile這個target。若想運行run這個target,則執行命令:ant run。這裡我們來分析一下執行這個target的流程:在run這個target中,depends屬性指定應先運行compile這個target;而compile又指定應先運行clean這個target。因此,整個流程是:先運行clean,把舊的classes目錄刪除,避免它包含的舊檔案造成幹擾;然後建立一個全新的classes目錄;然後運行compile target,編譯來源程式並將.class檔案輸出到classes目錄中;最後運行run target,執行編譯好的程式。當然,在編譯和執行程式的時候,ant都根據classpath和classpathref等的值,幫我們把相應的jar包和classes目錄載入到了classpath中。執行過程如下圖所示:
如上圖所示,ant將執行的大致步驟列印了出來。由此我們可以看出,ant首先找到組建檔案,然後按照我們在組建檔案中的定義,依次執行相應的target及其中的task。
若想讓ant列印出執行過程中的詳細資料,可執行命令:ant -verbose run。如下圖顯示了執行clean target時的詳細步驟:
而下圖則表明ant在調用原生java編譯器時,使用了-classpath參數,從而把我們的jar包載入進了classpath中。
(點擊下面的“附件下載”,可下載本文的ant工程。)
【MyBatis學習筆記】系列之預備篇一:ant的下載與安裝
【MyBatis學習筆記】系列之預備篇二:ant入門樣本
【MyBatis學習筆記】系列之一:MyBatis入門樣本
【MyBatis學習筆記】系列之二:MyBatis增刪改樣本
【MyBatis學習筆記】系列之三:MyBatis的association樣本
【MyBatis學習筆記】系列之四:MyBatis association的兩種形式
【MyBatis學習筆記】系列之五:MyBatis與Spring整合樣本
【MyBatis學習筆記】系列之六:MyBatis與Spring整合樣本續
【MyBatis學習筆記】系列之七:MyBatis一對多雙向關聯
【MyBatis學習筆記】系列之八:MyBatis MapperScannerConfigurer配置
【MyBatis學習筆記】系列之九:MyBatis collection的兩種形式
【MyBatis學習筆記】系列之十:MyBatis日誌之Log4j樣本
【MyBatis學習筆記】系列之十一:MyBatis多參數傳遞之註解方式樣本
【MyBatis學習筆記】系列之十二:MyBatis多參數傳遞之預設命名方式樣本
【MyBatis學習筆記】系列之十三:MyBatis多參數傳遞之Map方式樣本
【MyBatis學習筆記】系列之十四:MyBatis中的N+1問題
【MyBatis學習筆記】系列之十五:MyBatis多參數傳遞之混合方式
【MyBatis學習筆記】系列之十六:Spring聲明式交易管理樣本
【MyBatis學習筆記】系列之十七:MyBatis多對多儲存樣本
本文出自 “肖凡的專欄” 部落格,請務必保留此出處http://legend2011.blog.51cto.com/3018495/898736