由于水品有限,翻譯得比較直白,一些語句還無法斷定,所以同時(shí)寫上原文語句供大家參考。
個(gè)人覺得還是看得懂的,希望對大家有用。
2
用Ant安裝和構(gòu)建項(xiàng)目
這一章包括:
獲取和安裝hibernate
安裝和學(xué)習(xí)基本的Ant知識
建立和測試MySQL
使用Ant創(chuàng)建一個(gè)基本的項(xiàng)目
我們通過前面的示例認(rèn)識到對開發(fā)者來說hibernate是一個(gè)非常有用的工具。在這一章我們將討論如何獲得工具,建立項(xiàng)目和持久化Java對象。所有的不平凡的工具,包括像hibernate這樣的開源工具,為了更好的工作都有一些活動的部分需要被安裝。(hibernate have quite a few moving parts that need to be set up in order
to work correctly.)通常許多項(xiàng)目最困難的部分是開始—如果你從來沒有使用過hibernate建立項(xiàng)目,打算好從哪開始,那樣對學(xué)習(xí)有好處。(Often the most difficult part of any project is getting started –
and if you've never set up a project that uses Hibernate, figuring out where to
start can be a bit overwhelming.)
在這一章,我們將學(xué)習(xí)三種基本的開源工具:Hibernate; MySQL,一個(gè)非常流行的開源數(shù)據(jù)庫;Ant,第一的Java構(gòu)建工具。Ant對我們的項(xiàng)目例子不是必須的,但它能夠使事情更容易;如果不使用它來編程就好像束縛了一只手。
章節(jié)目標(biāo):
這一章的主要目的是使你能夠開始開發(fā)hibernate項(xiàng)目。為了達(dá)到這一點(diǎn),你需要在這一章結(jié)束后完成以下一些基本任務(wù)。
n
找到一份hibernate拷貝并安裝到自己的電腦上。
n
下載并安裝Ant。
n
建立MySQL,為了在示例項(xiàng)目中使用。
n
使用Ant創(chuàng)建一個(gè)基本的項(xiàng)目,這將為更多復(fù)雜項(xiàng)目作為模板使用。
完成這些目標(biāo)可以使你在后面的章節(jié)中更好的領(lǐng)會hibernate思想。另外,你也可以很輕松的完成一個(gè)hibernate項(xiàng)目。
前提條件:
為了使這章順利進(jìn)行,在我們開始之前還需要完成以下一些事情:
n
你已經(jīng)安裝好Sun JDK—最好是JDK1.4.x,因?yàn)樗梢愿玫闹С?span lang="EN-US">hibernate。如果你還沒有Sun JDK,瀏覽http://java.sun.com/j2se/,根據(jù)提示下載和安裝JDK。
n
你已經(jīng)為安裝的JDK配置好JAVA_HOME環(huán)境變量。
n
在這之前,你沒有安裝Ant,Hibernate,或者任一數(shù)據(jù)庫(MySQL)。這一章將講述這些,如果你已經(jīng)有或者直到安裝這些程序,可以輕松粗略看這一章或跳到第三章。你可能需要注意你的這些程序安裝位置,因?yàn)樗惺纠际墙⑦@章的基礎(chǔ)上。
注意:這個(gè)章節(jié)的大多數(shù)例子包括運(yùn)行Ant和MySQL都是使用命令行調(diào)用,這些例子可以在Windows,Unix,Linux,Macintoshes上運(yùn)行。為避免混亂,所有命令行使用普通的$的命令提示符(來自Mac),這比為每個(gè)平臺重復(fù)例子好。那好,讓我們看看這里:
$ ant clean build
它基本相當(dāng)于:
C:\applications\ant clean
build
針對每個(gè)不同的平臺,請參考該平臺上工具的文檔說明。
注意:在路徑中,我們使用具有代表性的正斜杠(/)代替Windows平臺的反斜杠(\),如果你使用的是Windows平臺,只需要反轉(zhuǎn)斜杠就可以了。
2.1獲得hibernate發(fā)布版本。
在創(chuàng)建你的hibernate項(xiàng)目的第一步就是從網(wǎng)站上獲取最新的拷貝。去hibernate官方網(wǎng)站www.hibernate.org,這里有豐富的信息,包括可靠的參考文檔,郵件列表和活躍的社區(qū)Wiki1 。現(xiàn)在,我們只需要編程,點(diǎn)擊主目錄的下載連接,選擇最近的3.x的hibernate發(fā)布版本。Hibernate發(fā)布版本有兩種類型:.zip和.tar.gz。
選擇適合你的平臺的版本(Windows用戶最好選擇.zip類型,Linux/Unix選擇.tar.gz類型),然后選擇離你最近的鏡像站點(diǎn),從類似圖2.1的列表中選擇。
圖2.1 從鏡像站點(diǎn)中選擇hibernate發(fā)布版本。
當(dāng)你下載好hibernate,創(chuàng)建一個(gè)應(yīng)用程序目錄用來存放解壓的hibernate。在Windows,創(chuàng)建C:\applications目錄。在Linux/Unix,創(chuàng)建/applications。解壓hibernate的發(fā)布版本到這個(gè)目錄下。在Windows ,你可以看到hibernate在C:\applications\hibernate-3.0看到如圖2.2所示:
圖2.2 在Windows中已經(jīng)解壓的hibernate。
注意一些包,如:hibernate3.jar,它包含了框架編碼;在/lib目錄下包含了hibernate所有所依賴的包;在/doc目錄下包含來JavaDocs和參考文檔。現(xiàn)在,你已經(jīng)有了hibernate,讓我們進(jìn)入下一節(jié)。
2.2安裝Ant
任何的軟件項(xiàng)目都需要能夠可靠的可重復(fù)的編譯,打包和發(fā)布。當(dāng)開發(fā)者準(zhǔn)備這些時(shí)就會涉及構(gòu)建過程。(the steps that developers take to put everything together are typically
referred as build process.)每次手動進(jìn)行這些時(shí),開發(fā)者不得不面對構(gòu)建項(xiàng)目,這樣可能會用錯(cuò)誤命令的調(diào)用,或者忘了調(diào)用,甚至根本不知道。(
Every manual step that a developer has to perform to build the
project is one that will be invoked in the wrong order, be forgotten, or be
known only to a guy who is inconveniently out getting a root canal.)為了避免這些手動錯(cuò)誤,你需要構(gòu)建工具,能過讓程序自動構(gòu)建。對Java而言,Ant是普遍的選擇。
自從Ant創(chuàng)建以來,它證明了自己在各種各樣的Java項(xiàng)目中的價(jià)值,并且成為了Java的著名的標(biāo)準(zhǔn)的構(gòu)建工具。因此它是幫你構(gòu)建hibernate項(xiàng)目最好的選擇。首先,我們得獲得一份拷貝。
Ant的主頁是http://ant.aparche.org/。宿主在Aparche軟件基金主機(jī)上,在這有許多著名的開源項(xiàng)目,包括Aparche HTTP
server。在這個(gè)網(wǎng)站上有許多有用的信息,特別是優(yōu)秀的Ant用戶手冊2。點(diǎn)擊左邊主菜單的Ant二進(jìn)制發(fā)布版本,選擇最新的版本(有.zip,.tar.gz或者tar.bz2格式)(目前最新是
下載完畢后,解壓Ant到你最新創(chuàng)建的applications目錄。Ant是個(gè)典型的用命令行運(yùn)行的工具。安裝Ant需要一些配置步驟。你需要定義一個(gè)指向Ant目錄的環(huán)境變量(set ANT_HOME=/applications/aparche-ant-
如果安裝正確,你可以在命令行中輸入以下命令:
$ ant
Buildfile: build.xml
does not exist!
Build failed
正如你所見,ant給你一個(gè)錯(cuò)誤提示,因?yàn)樗枰粋€(gè)叫build.xml的構(gòu)建文件。
有了Ant,你就可以開始使用構(gòu)建文件(典型稱謂build.xml)創(chuàng)建你的項(xiàng)目。我們將在2.4節(jié)開始。在此之前,你還需要你個(gè)數(shù)據(jù)庫。
2.3建立數(shù)據(jù)庫
Hibernate是個(gè)幾乎無縫連接你的Java項(xiàng)目到數(shù)據(jù)庫。定義一個(gè)映射文件,它能夠自動在內(nèi)存和持久化文件系統(tǒng)(平常使用的數(shù)據(jù)庫)之間把對象和SQLstatement來回轉(zhuǎn)換。
如果你使用過SQL,并不是所有的數(shù)據(jù)庫的SQL是一致的。盡管SQL是一個(gè)技術(shù)標(biāo)準(zhǔn),但每個(gè)數(shù)據(jù)庫提供商都有自己些許不同的“標(biāo)準(zhǔn)”版本。使用hibernate,你可以避免編寫提供商特定的JDBC代碼。你能夠?qū)懸粋€(gè)普通的應(yīng)用程序在任何數(shù)據(jù)庫部署,例如:Oracle,MySQL或者SQL
Server。只要你不寫自己的數(shù)據(jù)庫引擎,hibernate能夠很好的工作。
在我們的示例程序中,你將使用MySQL-一個(gè)開發(fā)者非常了解的流行的開源數(shù)據(jù)庫。你需要考慮到一點(diǎn):MySQL 4.0及以下版本不支持hibernate有時(shí)需要使用的子查詢。你可以使用老的版本;但在寫查詢語句有些不同。為了避免復(fù)雜化,這一章的例子使用支持子查詢的MySQL 4.1。
安裝MySQL是個(gè)復(fù)雜的過程,因此我們僅僅介紹在Windows的基本安裝。完整的文檔說明在http://dev.mysql.com/doc/。幸運(yùn)的是,從MySQL
從http://dev.mysql.com/downloads/獲得一份MySQL 4.1(或者更新)拷貝。選擇MySQL數(shù)據(jù)庫服務(wù),選擇適合你的平臺的二進(jìn)制版本,然后下載。運(yùn)行安裝。在安裝過程中,選擇作為Windows服務(wù)安裝MySQL,這樣做可以避免手動從命令行啟動MySQL服務(wù)器。
另外,如果你安裝了防火墻,例如:諾頓網(wǎng)絡(luò)安全特警,你需要配置防火墻允許從你的IP為127.0.0.1(loaclhost)當(dāng)前電腦連接到端口號為3306的MySQL服務(wù)器。
讓我們證明MySQL正在工作:
1 打開另外一個(gè)命令控制臺,在這個(gè)控制臺我們可以使用MySQL服務(wù)器,并在服務(wù)器 上SQL語句。
2 進(jìn)入mysql/bin目錄
$ cd
applications/mysql/bin
另外,你也可以把/bin目錄加入到path目錄,這樣你可以在任何地方運(yùn)行MySQL。
3 從mysql/bin目錄使用擁有完全操作權(quán)限root用戶進(jìn)入mysql:
$ mysql –u
root –p
-u指用戶名,-p 進(jìn)入MySQL的密碼。
4 當(dāng)MySQL要求輸入密碼時(shí),你可以敲擊Enter鍵,因?yàn)槟J(rèn)密碼為空:
Enter password:
服務(wù)器響應(yīng)信息
Welcome to the MySQL monitor, Commands end with; or\g.
Your MySQL connection id is 35 to server version:
5 為Hibernate的使用創(chuàng)建一個(gè)events_calendar數(shù)據(jù)庫,使用SQL語句如下:
mysql>create database events_calendar
服務(wù)器響應(yīng)信息:
Query OK, 1 row
affected(0.00 sec)
6 通過查詢數(shù)據(jù)庫列表證明數(shù)據(jù)庫已經(jīng)創(chuàng)建:
mysql> show databases;
+
--------------- +
| Database |
+
--------------- +
|
events_calendar |
| mysql |
| test |
+
--------------- +
3 row in
set(0.02 sec)
確信events_calendar已經(jīng)存在,這里還有MySQL自帶的數(shù)據(jù)庫(mysql和test)
7 在控制臺使用以下語句退出MySQL:
mysql>quit;
服務(wù)器響應(yīng):
Bye
在這一節(jié)你已經(jīng)成功作為Windows服務(wù)安裝設(shè)置MySQL,確定MySQL能夠運(yùn)行。包括安裝向?qū)г趦?nèi)的詳細(xì)信息在www.mysql.com。如果你仍然還有這方面的問題,安裝向?qū)芎芎玫膸椭汩_始和調(diào)試。
除了數(shù)據(jù)庫服務(wù)器,在這還需要JDBC驅(qū)動。驅(qū)動能夠使用Java代碼通過和發(fā)送SQL命令到數(shù)據(jù)庫服務(wù)器。驅(qū)動是數(shù)據(jù)庫專用的,但它實(shí)現(xiàn)了必須的javax.sql.Driver接口。這個(gè)接口保持了JDBC通用性,無須知道是什么數(shù)據(jù)庫。Hibernate的內(nèi)核中包裝了JDBC,因此你需要MySQL驅(qū)動很好的為你的項(xiàng)目服務(wù)。
到http://dev.mysql.com/downloads/找到名為Connector/J的驅(qū)動(當(dāng)前版本是3.1)。選擇最近的發(fā)布版本,下載后綴為.zip文件到/applications目錄。解壓.zip文件到這個(gè)目錄;它在這個(gè)目錄的路徑如/applications/mysql-connector-java-3.16(當(dāng)然,路徑末尾名稱跟版本匹配)。如果你查看這個(gè)目錄,你將發(fā)現(xiàn)一個(gè)名為mysql-connector-java-3.16-bin.jar的JAR文件,它包含了驅(qū)動。
2.4 建立項(xiàng)目
為了幫助闡述怎樣使用Hibernate,你要構(gòu)建一個(gè)簡單的應(yīng)用程序--Event Calendar 2005,一個(gè) 能夠增加事件,日程安排提醒和管理參與者的event/calendar-planning程序。
event calendar程序是Hibernate應(yīng)用很好的候選者,這有很多原因。日歷和日程安排在許多商業(yè)應(yīng)用中經(jīng)常使用,因此能為讀者更好的熟悉這個(gè)領(lǐng)域。Hibernate的亮點(diǎn)在于能夠應(yīng)用到多個(gè)領(lǐng)域模板。現(xiàn)實(shí)的事件應(yīng)用程序不得不處理許多復(fù)雜的關(guān)系,包括會議,演講會議,酒店,旅館和會客。
這本書的每一章都會一點(diǎn)點(diǎn)擴(kuò)展這個(gè)應(yīng)用程序,用Hibernate加入新的關(guān)系。但在你開發(fā)任何代碼之前,你都需要建立項(xiàng)目。現(xiàn)在你有了所有需要的構(gòu)建工具(Hibernate,Ant和MySQL數(shù)據(jù)庫),可以開始了。
任何成功的項(xiàng)目第一步是需要一個(gè)目錄,安裝以下說明創(chuàng)建:
1 創(chuàng)建一個(gè)/work目錄,這是一格基本的存放你將來項(xiàng)目運(yùn)行的目錄。
2 現(xiàn)在,你需要考慮你的Event Calendar應(yīng)用程序。因此,創(chuàng)建一個(gè)/work/calendar目錄。這個(gè)目錄從現(xiàn)在起作為你的項(xiàng)目的惡目錄。
3 在這個(gè)目錄中創(chuàng)建一個(gè)src/java目錄。你創(chuàng)建的所有Java資源文件將放在這個(gè)目錄中。不是.java的資源文件也可以放到這里,如:JSP,SQL,或者Hibernate映射文件(hbm.xml),這個(gè)將在下一節(jié)說到。
4 打開你喜歡的文本編輯器或者集成開發(fā)環(huán)境(IDE)3,在目錄中創(chuàng)建一個(gè)build.xml文件,暫時(shí)讓它空著。這就是你的Event Calendar程序Ant構(gòu)建文件。
讓我們對你是否做好準(zhǔn)備做個(gè)快速檢查。如果你都做好了,你將有像下面這樣的目錄結(jié)構(gòu):
-----------------------------------------------------------------------------------------
/applications/apache-ant-
/applications/hibernate-3.0
/applications/mysql
/applications/mysql-connector-java-
項(xiàng)目目錄已經(jīng)建好,讓我們繼續(xù),開發(fā)Ant構(gòu)建文件
你開始的Ant構(gòu)建文件不必太過于復(fù)雜,只要能夠完成基本的步驟就可以了。你將用它來創(chuàng)建目錄,編譯類文件,并且運(yùn)行類文件。你也將學(xué)到幾點(diǎn)關(guān)于Ant的重要的概念,包括targets, tasks, paths和properties。
自行鍵入代碼或者你也可以從www.manning.com/peak下載書中的源代碼。找到ch02目錄中的build.xml文件,在你的編輯器中打開(看listing2.1)。遍及這一章,你將在不同的開發(fā)階段修改這個(gè)文件,最好將不同的版本保存。
Listing 2.1 First Ant build file, build.xml
-------------------------------------------------------------------------------
<?xml version="1.0" encoding="GBK"?>
<!--基本的根元素-->
<project
name="build.xml" default="build">
<!--定義可重復(fù)調(diào)用的元素-->
<property
name="src.java.dir" location="src/java"/>
<property
name="build.classes.dir" location="build/classes"/>
<!--定義class-->
<path
id="project.classpath">
<pathelement
location="${build.classes.dir}"/>
</path>
<!-- 創(chuàng)建存放編譯文件的目錄 -->
<target
name="init">
<mkdir
dir="${build.classes.dir}"/>
</target>
<!-- 編譯src中的文件 -->
<target
name="compile" depends="init">
<javac
srcdir="${src.java.dir}" destdir="${build.classes.dir}">
<include
name="**/EventCalendar.java"/>
</javac>
</target>
<!-- 運(yùn)行編譯好的類文件 -->
<target
name="build" depends="compile">
<java
classname="com.manning.hq.ch02.EventCalendar"
failonerror="true">
<classpath
refid="project.classpath"/>
</java>
<echo>If
you see this,it works!!!</echo>
</target>
</project>
-------------------------------------------------------------------------------
因?yàn)檫@可能是你的第一個(gè)構(gòu)建文件,讓我們根據(jù)這個(gè)例子來討論Ant使用的一些概念。
Projects(項(xiàng)目)
我們都知道XML文件格式需要一個(gè)根元素,Ant也不例外。基本元素是<project>。正如你所看到的兩個(gè)屬性(attribute)是name和default。Name屬性是描述你的項(xiàng)目的名稱,能用任何名字。Default(默認(rèn))屬性是指當(dāng)你運(yùn)行Ant時(shí)調(diào)用的target(目標(biāo)),而不需要在命令好行中特別指出。在這我們調(diào)用名為build的target(目標(biāo)):
<project name="build.xml" default="build">
Property(特性)
特性是Ant的變量。很多項(xiàng)目為一些經(jīng)常在當(dāng)前文件中使用的目錄或文件名定義許多特性(最好將這些特性放在項(xiàng)目的首部)。一旦你定義了特性,你就可以使用${property.name}的語句來代替特性值,就像這樣:
<property name="src.java.dir"
location="src/java"/>
用這種方法定義了特性,你就可以隨處使用特性${src.java.dir},否則你需要輸入完整的目錄路徑。特性轉(zhuǎn)變成關(guān)聯(lián)的目錄就是:/work/calendar/src/java。關(guān)聯(lián)目錄例如src/java,通常用于解決build.xml文件中的關(guān)聯(lián)位置。你定義了兩個(gè)特性:一個(gè)是你的Java資源文件目錄,另一個(gè)是Java文件編譯后的.class文件的目錄。
Paths(路徑)
Paths允許你定義一連串的目錄和/或者任務(wù)使用的JAR文件。Path一般定義為.java文件編譯或者運(yùn)行.class文件的類路徑。用id屬性創(chuàng)建一個(gè)<path>元素可以讓你多次重復(fù)使用相同的classpath。在這里,我們指定了<path>元素和名為project.classpath的id,并且指定了.class文件的編譯目錄:
-------------------------------------------------------------------------------
<path id="project.classpath">
<pathelement
location="${build.classes.dir}"/>
</path>
------------------------------------------------------------------------------
這個(gè)路徑是簡單的-僅僅只是自己的目錄。當(dāng)你添加更多第三方的JAR文件(如Hibernaete),classpath變得更復(fù)雜,Ant的價(jià)值也就體現(xiàn)出來。機(jī)靈的人能夠很好的掌控classpaths,事實(shí)上是Ant幫助他們管理了復(fù)雜性的東西。(Classpaths can be tricky
beasts to get right, and the fact that Ant helps manage their complexities is
worth the price of entry)。
Targets(目標(biāo))
Targets是Ant的公共方法。它們包含了你將進(jìn)行的任務(wù)。通過將構(gòu)建文件分成幾個(gè)targets,你就能夠更好的組織和管理構(gòu)建文件了。Targets能夠依賴其它的Targets,如果你指定一個(gè)依賴屬性(depends attribute)。當(dāng)你在執(zhí)行target之前調(diào)用它,Ant就會調(diào)用這個(gè)target所依賴的其它targets。
在這個(gè)文件中,注意依賴“compile target”的“build target”,“compile target”又依賴“init target”。我們能夠這樣輸入:
$ ant build
因?yàn)樯厦婺菞l命令,Ant將執(zhí)行init, compile和build的targets,這次我們可以用default屬性來演示。關(guān)于default屬性可以參考“Projects”部分。因此我們定義“build”為default屬性,輸入:
$ ant
Ant將同樣的執(zhí)行init,
compile和build的targets一次。
Tasks(任務(wù))
如果targets是Ant的公共方法,那么tasks是它的私有方法和指令。一個(gè)構(gòu)建文件包括幾個(gè)tasks,包括一下這些:
n
mkdir創(chuàng)建一個(gè)${build.classes.dir}。因此這個(gè)目錄僅僅包含了源文件,你能過刪除整個(gè)目錄來從新編譯。
n
javac編譯Java文件為.class文件,并且將它們放置在${build.classes.dir}。
n
echo是Ant的“System.out.println()”版本。它輸出消息到命令行。
Tasks的基本使用比較簡單,但你能夠通過配置屬性來豐富你的使用。我們建議你去查看Ant用戶手冊 來獲取完整信息。
現(xiàn)在構(gòu)建文件已經(jīng)完成,但還有一個(gè)顯而易見遺忘的錯(cuò)誤:沒有EventCalendar類。讓我們現(xiàn)在就來創(chuàng)建。在src/java目錄下創(chuàng)建一個(gè)新的com/manning/hq/ch02的目錄。然后創(chuàng)建EventCalendar.java文件。任何一本書沒有Hello World程序都不是完整;不會讓你失望,這里就有:
-------------------------------------------------------------------------------
package
com.manning.hq.ch02;
public
class EventCalendar{
public static void main(String[] args){
System.out.println("Welcome to
Event Calendar 2005");
}
}
-------------------------------------------------------------------------------
當(dāng)你運(yùn)行這個(gè)類時(shí),它會歡迎預(yù)期的用戶到Event Calendar。(When it runs, your class
welcomes prospective users to the Event Calendar.)
現(xiàn)在你有了所有必須的類,你將運(yùn)行構(gòu)建文件了。通過命令行跳轉(zhuǎn)到存放構(gòu)建文件的目錄。輸入以下命令:
-------------------------------------------------------------------------------
$ ant
Buildfile:build.xml
Init:
Compile:
[javac]Compiling 1 source file to
C:\work\calendar\build\classes
Build:
[java]Welcome to Event Calendar 2005
[echo]If you see this, it works!!!
BUILD SUCCESSFUL
Total time: 2 seconds
-------------------------------------------------------------------------------
如果你都設(shè)置正確,那么你將看到上面相似的畫面。如果你是第一次使用Ant,注意以下幾點(diǎn):
n
Ant隱式的調(diào)用build.xml,因此你不需要輸入構(gòu)建文件的名稱,但是還是提醒你最好在第一行使用名稱。
n
盡管你從沒有指定調(diào)用哪個(gè)target,Ant使用project(項(xiàng)目)的default(默認(rèn))屬性來調(diào)用“build target”。
n
當(dāng)Ant執(zhí)行每個(gè)target時(shí)會顯示target的名稱。這是為什么你會看到:init, compile和build。
n
你定義的大多數(shù)tasks都會紀(jì)錄自己的信息到日志。
當(dāng)你看Ant輸出信息時(shí),你不會真的去關(guān)心你在<echo>和System.out.println中的信息,你只會關(guān)心task是否被執(zhí)行,Ant輸出的文件在哪。所以,大多是有用的測試信息是從javac task中顯示的信息,這里就是:
[javac] Compiling 1 source
file c:\work\calendar\build\classes
這條輸出信心告訴我們Ant正在存放已編譯的Java .class文件。(This output tells you where Ant is dumping the compiled Java .class
files)還記得在構(gòu)建文件中指定了使用在Ant屬性中的destdir屬性:
<javac destdir=”${build.classes.dir}”/>
你能在構(gòu)建文件時(shí)確定所有的特性建立正確的目錄和文件是個(gè)聰明的想法。在這個(gè)案例中,通過輸出信息,你能夠知道${build.classes.dir}已經(jīng)及時(shí)轉(zhuǎn)換/work/calendar/build/classes目錄。
你已經(jīng)創(chuàng)建了基本的構(gòu)建文件并且將它放置到正確的位置。在下一節(jié),你將擴(kuò)展這個(gè)例子,加入一些Hibernate文件。
2.5 一些高效率構(gòu)建文件的習(xí)慣
創(chuàng)建一個(gè)組織好的,一致的的項(xiàng)目結(jié)構(gòu)需要在開始就考慮構(gòu)建,但是隨著項(xiàng)目的發(fā)展總要增加一些額外的東西。(Creating an organized, consistent project structure takes a bit of
thought up front, but that work pays dividends later as the project growns in
size.) 作為工具,Ant在組織項(xiàng)目時(shí)具有很大的彈性;但是沒有的結(jié)構(gòu),因?yàn)樘袕椥远鴮?dǎo)致構(gòu)建更復(fù)雜。
開源項(xiàng)目通常發(fā)展很快,最新的版本不多久就會發(fā)布。為了項(xiàng)目的建立最好獲取Hibernate的最近發(fā)布的拷貝,這樣能夠更好的編譯和測試你的最近版本的代碼。
就像Ant的優(yōu)點(diǎn)一樣,它的一直以來的缺點(diǎn)之一就是在相個(gè)項(xiàng)目之間有許多一樣的部分。兩個(gè)項(xiàng)目有著自己的構(gòu)建文件,執(zhí)行基本相同的步驟,僅僅是目錄不同。例如,如果你想用Hibernate,你將在下一節(jié)使用它。為什么還要為了這個(gè)項(xiàng)目重寫構(gòu)建文件(或者只是復(fù)制和粘貼)呢?在Ant
在此之前,你已經(jīng)下載和安裝了Hibernate。現(xiàn)在讓我們在項(xiàng)目中使用它。你需要去修改build.xml文件,讓它通過修飾將Hibernate的JAR文件加入classpath。
更新構(gòu)建文件
在源代碼中顯示了每一個(gè)修改過程,你從而在構(gòu)建文件的。(if you’re following the source code, to show the progress of each
modification, you’ve sequentially numbered the build files in the source code.)如果你想運(yùn)行這個(gè)(而不是修改你現(xiàn)存德構(gòu)建文件),輸入ant –f build2.xml來指定其他構(gòu)建文件而不是默認(rèn)的build.xml。現(xiàn)在打開build.xml顯示修改的部分,如listing2.2。
Listing 2.2 Update build file(build2.xml)
-------------------------------------------------------------------------------
<?xml version="1.0" encoding="GBK"?>
<!--基本的根元素-->
<project
name="build.xml" default="build">
<!--定義可重復(fù)調(diào)用的元素-->
<property
name="src.java.dir" location="src/java"/>
<property name="build.classes.dir"
location="build/classes"/>
<!-- ①設(shè)置Hibernate版本
-->
<property
name="hibernate.version" value="3.0"/>
<!-- ②設(shè)置Hibernate安裝的基本目錄路徑 -->
<project
name="hibernate.lib.dir" location="E:/Program Files/hibernate-${hibernate.version}"/>
<!--定義class-->
<path
id="project.classpath">
<pathelement
location="${build.classes.dir}"/>
</path>
<!-- ③定義Hibernate和它所有JAR的classpath -->
<path
id="hibernate.lib.path">
<fileset dir="${hibernate.lib.dir}/lib">
<include
name="**/*.jar"/>
</fileset>
<fileset
dir="${hibernate.lib.dir}">
<include
name="hibernate3.jar"/>
</fileset>
</path>
<!-- 創(chuàng)建存放編譯文件的目錄
-->
<target
name="init">
<mkdir dir="${build.classes.dir}"/>
</target>
<!-- 編譯src中的文件 -->
<target
name="compile" depends="init">
<javac
srcdir="${src.java.dir}" destdir="${build.classes.dir}">
<!-- ④為編譯添加Hibernate -->
<classpath
refid="hibernate.lib.path" />
</javac>
</target>
<!-- 運(yùn)行編譯好的類文件 -->
<target
name="build" depends="compile">
<!-- ⑤使用新的類 -->
<java
classname="com.manning.hq.ch02.EventCalendar2">
<classpath
refid="project.classpath"/>
<!-- ⑥添加Hibernate去運(yùn)行Java文件 -->
<classpath
refid="hibernate.lib.path" />
</java>
<echo>If you
see this,it works!!!</echo>
</target>
<!-- ⑦添加刪除target -->
<target
name="clean">
<delete
dir="${build.classes.dir}"/>
</target>
</project>
-------------------------------------------------------------------------------
①通過參數(shù)設(shè)置你使用的Hibernate的版本號,可以能夠輕易的安裝新版本的Hibernate。只需要下載新版本,從命名已有目錄的版本號數(shù)字(例如3.0),并且更新hibernate.version的特性。構(gòu)建你的項(xiàng)目,確定每一項(xiàng)能工作。不需要復(fù)制大量的JAR文件了。
②hibernate.lib.dir顯示了一些比較高級的特性用法;目錄部分時(shí)靜態(tài)的,而版本號是特性。
③這里你創(chuàng)建了一個(gè)新的path元素,包括了hibernate3.jar文件和所有jar包(dependencies---本想翻譯成依賴包,但覺得不合適) 。
④這段代碼添加了在編譯時(shí)Hibernate的classpath。
⑤轉(zhuǎn)變了你將運(yùn)行的類:com.manning.hq.ch02.EventCalendar2。
⑥這里添加了運(yùn)行Java文件時(shí)Hibernate的classpath。
⑦讓我們清除構(gòu)建的項(xiàng)目,建立新的框架。
-------------------------------------------------------------------------------
改進(jìn)的Ant構(gòu)建文件構(gòu)造了Hibernate的classpath,使用它運(yùn)行復(fù)雜的Java類程序。
帶Log4j的簡單的類
EventCalendar2在第一個(gè)類文件(EventCalendar)上稍微有些改變。它使用了Hibernate和它的jar包中的一些類。現(xiàn)的類文件使用了兩個(gè)jar包:一個(gè)來自Hibernate,另一個(gè)是:log4j.jar。讓我們來看看修改過的類:
-------------------------------------------------------------------------------
package com.manning.hq.ch02;
import
org.hibernate.cfg.Configuration;
import org.apache.log4j.BasicConfigurator;
import
org.apache.log4j.Logger;
public class EventCalendar2{
public static void main(String[] args){
BasicConfigurator.configure(); //配置log4j
Configuration config=new Configuration();//使用Hibernate包
Logger log=Logger.getLogger(EventCalendar2.class);
log.warn("Welcome to Event Calendar 2005");
}
}
-------------------------------------------------------------------------------
這里沒有太大的變化。你配置了 Log4j,一個(gè)開源的日志框架,紀(jì)錄命令行消息日志。然后你創(chuàng)建了一個(gè)基本的Hibernate結(jié)構(gòu)(你將在下面章節(jié)學(xué)到)。這并不沒有達(dá)到目標(biāo),但足夠用于確定你是否設(shè)置好classpath,如果沒設(shè)置正確,文件將不能編譯或運(yùn)行。org.hibernate.cfg.Configuration類來自Hibernate3.jar,org.aparche.log4j.*類來自hibernate/lib目錄下的log4j.jar。最終,你使用Log4j把成功的信息輸出到控制臺。這就確信你已經(jīng)設(shè)置好在classpath中的jar文件。
現(xiàn)在你能夠運(yùn)行你的構(gòu)建文件。你將看到:
-------------------------------------------------------------------------------
$ ant –f build2.xml
clean build
Buildfile: build2.xml
init:
compile:
[javac] Compiling 1
source file to E:\applications\work\calendar\build\class
es
build:
[java] 0 [main] INFO
org.hibernate.cfg.Environment - Hibernate
[java] 15 [main]
INFO org.hibernate.cfg.Environment -
hibernate.properties
not found
[java] 15 [main]
INFO org.hibernate.cfg.Environment -
using CGLIB reflecti
on optimizer
[java] 31 [main]
INFO org.hibernate.cfg.Environment - using
JDK 1.4 java.s
ql.Timestamp handling
[java] 344 [main]
WARN com.manning.hq.ch02.EventCalendar2
- Welcome to Eve
nt Calendar 2005
[echo] If you see
this,it works!!!
BUILD SUCCESSFUL
Total time: 8 seconds
-------------------------------------------------------------------------------
通過命令行,你運(yùn)行了構(gòu)建文件中的兩個(gè)target。clean target刪除build/classes目錄,構(gòu)建一個(gè)空的build/classese目錄。EventCalendar 和EventCalendar2都成功編譯。Ant然后運(yùn)行EventCalendar2 Java文件。你成功配置Hibernate就能看到“Welcome to Event Calendar”消息。
現(xiàn)在你已經(jīng)在構(gòu)建文件中加入Hibernate,這可以證明Ant可重新導(dǎo)入的特點(diǎn)。構(gòu)建文件包括兩個(gè)可重用塊:fileset和定義Hibernate安裝位置的path元素。他們遍歷Hibernate目錄,然后定義需要的JAR文件位置。構(gòu)建文件通過可重用使用在其他的項(xiàng)目上。如果以后你更新Hibernate的版本,你就能輕松的在build.xml中指向提取的新的版本的新目錄,然后就可以了。
記下來時(shí)創(chuàng)建新的文件,hibernate-build.xml,基于你的可重用的構(gòu)建文件。你將從build.xml文件中提取hibernate.lib.path到hibernate-build.xml(listing 2.3) 。
Listing2.3 hibernate-build.xml: Defines a generic classpath for
any Hibernate installation
-------------------------------------------------------------------------------
<?xml version="1.0"?>
<project name="hibernate-build.xml"
default="default">
<path
id="hibernate.lib.path">
<fileset
dir="${hibernate.lib.dir}/lib">
<include
name="**/*.jar"/>
</fileset>
<fileset
dir="${hibernate.lib.dir}">
<include
name="hibernate3.jar"/>
</fileset>
</path>
<target
name="default"/>
</project>
-------------------------------------------------------------------------------
這是個(gè)完整的構(gòu)建文件。從一個(gè)內(nèi)部特定的目錄開始,${hibernate.lib.dir},構(gòu)建classpath。它允許hibernate-build.xml導(dǎo)入到項(xiàng)目中去,它特指了Hibernate的安裝位置,能夠使用path就像它是構(gòu)建文件項(xiàng)目的一部分。下面,修改你的build.xml文件,導(dǎo)入hibernate-build.xml文件。
Listing2.4 build3.xml: Refactored build file imports a
classpath from hibernate-build.xml
-------------------------------------------------------------------------------
<?xml version="1.0" encoding="GBK"?>
<project name="build.xml"
default="build">
<property
name="src.java.dir" location="src/java"/>
<property
name="build.classes.dir" location="build/classes"/>
<property
name="hibernate.version" value="3.0"/>
<property
name="hibernate.lib.dir" location="E:/Program
Files/hibernate-${hibernate.version}"/>
<path
id="project.classpath">
<pathelement
location="${build.classes.dir}"/>
</path>
<!-- 用import置換path -->
<import
file="hibernate-build.xml"/>
<target
name="init">
<mkdir
dir="${build.classes.dir}"/>
</target>
<target
name="compile" depends="init">
<javac
srcdir="${src.java.dir}" destdir="${build.classes.dir}">
<classpath
refid="hibernate.lib.path" />
</javac>
</target>
<target
name="build" depends="compile">
<java
classname="com.manning.hq.ch02.EventCalendar2">
<classpath
refid="project.classpath"/>
<classpath
refid="hibernate.lib.path" />
</java>
<echo>If you
see this,it works!!!</echo>
</target>
<target
name="clean">
<delete
dir="${build.classes.dir}"/>
</target>
</project>
-------------------------------------------------------------------------------
新加入的行是import task,它置換了在build2.xml中的path指令。將hibernate-build.xml直接導(dǎo)入build.xml。hibernate.lib.path仍然在build.xml定義。測試并運(yùn)行:
----------------------------------------------------------------------------------------------------------------------
$ ant -f build3.xml clean build
Buildfile: build3.xml
clean:
[delete] Deleting directory E:\applications\work\calendar\build\classes
init:
[mkdir] Created dir: E:\applications\work\calendar\build\classes
compile:
[javac] Compiling 2 source files to E:\applications\work\calendar\build\clas
ses
build:
[java] 0 [main] INFO org.hibernate.cfg.Environment - Hibernate
[java] 16 [main] INFO org.hibernate.cfg.Environment - hibernate.properties
not found
[java] 16 [main] INFO org.hibernate.cfg.Environment - using CGLIB reflecti
on optimizer
[java] 16 [main] INFO org.hibernate.cfg.Environment - using JDK 1.4 java.s
ql.Timestamp handling
[java] 344 [main] WARN com.manning.hq.ch02.EventCalendar2 - Welcome to Eve
nt Calendar 2005
[echo] If you see this,it works!!!
BUILD SUCCESSFUL
Total time: 5 seconds
----------------------------------------------------------------------------------------------------------------------
成功的運(yùn)行修改了的文件就會看到以上這些輸出。Ant運(yùn)行了javac 和java task,這些task依賴成功配置hibernate.lib.path。
但是構(gòu)建文件會不會失敗呢?如果你看到以下的內(nèi)容,就表示導(dǎo)入不正確。
-------------------------------------------------------------------------------
$ ant -f build3.xml clean build
Buildfile: build3.xml
BUILD FAILED
E:\applications\work\calendar\build3.xml:11: Cannot find
hibernate-build.xml imp
orted from E:\applications\work\calendar\build3.xml
Total time: 1 second
-------------------------------------------------------------------------------
雙擊檢查你是否已經(jīng)導(dǎo)入hibernate-build.xml文件,構(gòu)建文件包含了hibernate.lib.path的配置。
這一章僅討論了一些基本的Ant工作原理,示范了基本的構(gòu)建文件。這已經(jīng)有足夠的信息去開始了,這里還有一些值得做的事情。查看Ant用戶手冊(特別是,Ant核心tasks),你將學(xué)到更多特定的task例如:import和javac。
2.6 總結(jié)
在這一章,我們學(xué)到了基本的建立Hibernate的步驟,包括獲得Hibernate,MySQL數(shù)據(jù)庫和Ant構(gòu)建工具。Hibernate發(fā)布版本是個(gè)大的zip文件;它包括文檔,資源代碼和JAR文件,包括基本的hibernate3.jar和所有Hibernate依賴的JAR文件。為了獲得更多信息,你能夠在Hibernate主頁www.hibernate.org找到;包括用戶手冊和社區(qū),這是兩個(gè)非常有用的資源。
Ant是Java構(gòu)建工具。它允許開發(fā)者在任何平臺構(gòu)建重復(fù)的項(xiàng)目。它的主頁的地址:http://ant.apache.org。Ant使用XML文件定義構(gòu)建過程步驟。默認(rèn)的命名為build.xml。Ant1.6能夠?qū)?gòu)建文件最為模板和可重用在不同項(xiàng)目中。
Hibernate能夠使用在大多數(shù)數(shù)據(jù)庫上,包括MySQl,只要有JDBC驅(qū)動。MySQL是最普遍的開源數(shù)據(jù)庫,地址:www.mysql.com。
1、 什么是Wiki? 可以把它認(rèn)為是一個(gè)參業(yè)者可以閱讀,學(xué)習(xí),發(fā)表自己的觀點(diǎn)的巨大的多人互動的社區(qū)網(wǎng)站。瀏覽http://c2.com/cgi/wiki?WikiWikiWeb官方網(wǎng)站,獲取更多信息。
2、 在我們的觀點(diǎn)中,Ant使用手冊(http://ant.aparche.org/manual/index.html)是最好的文檔之一,它有著很好的例子,這在相對貧乏的開源項(xiàng)目文檔中是少有的。它除了顯示變量參數(shù)和任務(wù)之外,還為每個(gè)任務(wù)提供了例子,你能夠輕松的復(fù)制和修改。
3、 討論一個(gè)“優(yōu)秀”的IDE必會像在午餐桌上談?wù)撟诮袒蛘哒伟l(fā)生爭論。現(xiàn)在大多數(shù)IDE都集成了Ant,甚至有Hibernate插件,這樣能夠更容易管理項(xiàng)目。作者比較偏愛IDEA(www.intellij.com)和Eclipse(www.eclipse.org/)。