這是節選了《Manning.Hibernate.Quickly.Aug.2005》的第二章。這一章說了很多基本的知識,特別是Ant,這個構建工具在開發項目中非常有用。
由于水品有限,翻譯得比較直白,一些語句還無法斷定,所以同時寫上原文語句供大家參考。
個人覺得還是看得懂的,希望對大家有用。
2
用Ant安裝和構建項目
這一章包括:
獲取和安裝hibernate
安裝和學習基本的Ant知識
建立和測試MySQL
使用Ant創建一個基本的項目
我們通過前面的示例認識到對開發者來說hibernate是一個非常有用的工具。在這一章我們將討論如何獲得工具,建立項目和持久化Java對象。所有的不平凡的工具,包括像hibernate這樣的開源工具,為了更好的工作都有一些活動的部分需要被安裝。(hibernate have quite a few moving parts that need to be set up in order
to work correctly.)通常許多項目最困難的部分是開始—如果你從來沒有使用過hibernate建立項目,打算好從哪開始,那樣對學習有好處。(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.)
在這一章,我們將學習三種基本的開源工具:Hibernate; MySQL,一個非常流行的開源數據庫;Ant,第一的Java構建工具。Ant對我們的項目例子不是必須的,但它能夠使事情更容易;如果不使用它來編程就好像束縛了一只手。
章節目標:
這一章的主要目的是使你能夠開始開發hibernate項目。為了達到這一點,你需要在這一章結束后完成以下一些基本任務。
n
找到一份hibernate拷貝并安裝到自己的電腦上。
n
下載并安裝Ant。
n
建立MySQL,為了在示例項目中使用。
n
使用Ant創建一個基本的項目,這將為更多復雜項目作為模板使用。
完成這些目標可以使你在后面的章節中更好的領會hibernate思想。另外,你也可以很輕松的完成一個hibernate項目。
前提條件:
為了使這章順利進行,在我們開始之前還需要完成以下一些事情:
n
你已經安裝好Sun JDK—最好是JDK1.4.x,因為它可以更好的支持hibernate。如果你還沒有Sun JDK,瀏覽http://java.sun.com/j2se/,根據提示下載和安裝JDK。
n
你已經為安裝的JDK配置好JAVA_HOME環境變量。
n
在這之前,你沒有安裝Ant,Hibernate,或者任一數據庫(MySQL)。這一章將講述這些,如果你已經有或者直到安裝這些程序,可以輕松粗略看這一章或跳到第三章。你可能需要注意你的這些程序安裝位置,因為所有示例都是建立這章的基礎上。
注意:這個章節的大多數例子包括運行Ant和MySQL都是使用命令行調用,這些例子可以在Windows,Unix,Linux,Macintoshes上運行。為避免混亂,所有命令行使用普通的$的命令提示符(來自Mac),這比為每個平臺重復例子好。那好,讓我們看看這里:
$ ant clean build
它基本相當于:
C:\applications\ant clean
build
針對每個不同的平臺,請參考該平臺上工具的文檔說明。
注意:在路徑中,我們使用具有代表性的正斜杠(/)代替Windows平臺的反斜杠(\),如果你使用的是Windows平臺,只需要反轉斜杠就可以了。
2.1獲得hibernate發布版本。
在創建你的hibernate項目的第一步就是從網站上獲取最新的拷貝。去hibernate官方網站www.hibernate.org,這里有豐富的信息,包括可靠的參考文檔,郵件列表和活躍的社區Wiki1 。現在,我們只需要編程,點擊主目錄的下載連接,選擇最近的3.x的hibernate發布版本。Hibernate發布版本有兩種類型:.zip和.tar.gz。
選擇適合你的平臺的版本(Windows用戶最好選擇.zip類型,Linux/Unix選擇.tar.gz類型),然后選擇離你最近的鏡像站點,從類似圖2.1的列表中選擇。

圖2.1 從鏡像站點中選擇hibernate發布版本。
當你下載好hibernate,創建一個應用程序目錄用來存放解壓的hibernate。在Windows,創建C:\applications目錄。在Linux/Unix,創建/applications。解壓hibernate的發布版本到這個目錄下。在Windows ,你可以看到hibernate在C:\applications\hibernate-3.0看到如圖2.2所示:

圖2.2 在Windows中已經解壓的hibernate。
注意一些包,如:hibernate3.jar,它包含了框架編碼;在/lib目錄下包含了hibernate所有所依賴的包;在/doc目錄下包含來JavaDocs和參考文檔。現在,你已經有了hibernate,讓我們進入下一節。
2.2安裝Ant
任何的軟件項目都需要能夠可靠的可重復的編譯,打包和發布。當開發者準備這些時就會涉及構建過程。(the steps that developers take to put everything together are typically
referred as build process.)每次手動進行這些時,開發者不得不面對構建項目,這樣可能會用錯誤命令的調用,或者忘了調用,甚至根本不知道。(
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.)為了避免這些手動錯誤,你需要構建工具,能過讓程序自動構建。對Java而言,Ant是普遍的選擇。
自從Ant創建以來,它證明了自己在各種各樣的Java項目中的價值,并且成為了Java的著名的標準的構建工具。因此它是幫你構建hibernate項目最好的選擇。首先,我們得獲得一份拷貝。
2.2.1獲得Ant
Ant的主頁是http://ant.aparche.org/。宿主在Aparche軟件基金主機上,在這有許多著名的開源項目,包括Aparche HTTP
server。在這個網站上有許多有用的信息,特別是優秀的Ant用戶手冊2。點擊左邊主菜單的Ant二進制發布版本,選擇最新的版本(有.zip,.tar.gz或者tar.bz2格式)(目前最新是1.6.2版本),下載保存。
2.2.2解壓和安裝Ant
下載完畢后,解壓Ant到你最新創建的applications目錄。Ant是個典型的用命令行運行的工具。安裝Ant需要一些配置步驟。你需要定義一個指向Ant目錄的環境變量(set ANT_HOME=/applications/aparche-ant-1.6.2)。同時要將Ant bin加入到path路徑(在Windows中,set PATH=%ANT_HOME%\bin;%PATH%)。
$ ant
Buildfile: build.xml
does not exist!
正如你所見,ant給你一個錯誤提示,因為它需要一個叫build.xml的構建文件。
有了Ant,你就可以開始使用構建文件(典型稱謂build.xml)創建你的項目。我們將在2.4節開始。在此之前,你還需要你個數據庫。
2.3建立數據庫
Hibernate是個幾乎無縫連接你的Java項目到數據庫。定義一個映射文件,它能夠自動在內存和持久化文件系統(平常使用的數據庫)之間把對象和SQLstatement來回轉換。
如果你使用過SQL,并不是所有的數據庫的SQL是一致的。盡管SQL是一個技術標準,但每個數據庫提供商都有自己些許不同的“標準”版本。使用hibernate,你可以避免編寫提供商特定的JDBC代碼。你能夠寫一個普通的應用程序在任何數據庫部署,例如:Oracle,MySQL或者SQL
Server。只要你不寫自己的數據庫引擎,hibernate能夠很好的工作。
在我們的示例程序中,你將使用MySQL-一個開發者非常了解的流行的開源數據庫。你需要考慮到一點:MySQL 4.0及以下版本不支持hibernate有時需要使用的子查詢。你可以使用老的版本;但在寫查詢語句有些不同。為了避免復雜化,這一章的例子使用支持子查詢的MySQL 4.1。
2.3.1 獲得MySQL
安裝MySQL是個復雜的過程,因此我們僅僅介紹在Windows的基本安裝。完整的文檔說明在http://dev.mysql.com/doc/。幸運的是,從MySQL 4.1.5開始安裝更加簡單;這里有適合你的Windows安裝版本。
從http://dev.mysql.com/downloads/獲得一份MySQL 4.1(或者更新)拷貝。選擇MySQL數據庫服務,選擇適合你的平臺的二進制版本,然后下載。運行安裝。在安裝過程中,選擇作為Windows服務安裝MySQL,這樣做可以避免手動從命令行啟動MySQL服務器。
另外,如果你安裝了防火墻,例如:諾頓網絡安全特警,你需要配置防火墻允許從你的IP為127.0.0.1(loaclhost)當前電腦連接到端口號為3306的MySQL服務器。
2.3.2測試MySQL
讓我們證明MySQL正在工作:
1
打開另外一個命令控制臺,在這個控制臺我們可以使用MySQL服務器,并在服務器 上SQL語句。
2 進入mysql/bin目錄
$ cd
applications/mysql/bin
另外,你也可以把/bin目錄加入到path目錄,這樣你可以在任何地方運行MySQL。
3 從mysql/bin目錄使用擁有完全操作權限root用戶進入mysql:
$ mysql –u
root –p
-u指用戶名,-p 進入MySQL的密碼。
4 當MySQL要求輸入密碼時,你可以敲擊Enter鍵,因為默認密碼為空:
Enter password:
服務器響應信息
Welcome to the MySQL monitor, Commands end with; or\g.
Your MySQL connection id is 35 to server version: 4.1.10-nt
Type ‘help;’ or ‘\h’ for help. Type ‘\c’to clear the buffer.
5 為Hibernate的使用創建一個events_calendar數據庫,使用SQL語句如下:
mysql>create database events_calendar
服務器響應信息:
Query OK, 1 row
affected(0.00 sec)
6 通過查詢數據庫列表證明數據庫已經創建:
mysql> show databases;
+
--------------- +
| Database |
+
--------------- +
|
events_calendar |
| mysql |
| test |
+
--------------- +
3 row in
set(0.02 sec)
確信events_calendar已經存在,這里還有MySQL自帶的數據庫(mysql和test)
7 在控制臺使用以下語句退出MySQL:
mysql>quit;
服務器響應:
Bye
在這一節你已經成功作為Windows服務安裝設置MySQL,確定MySQL能夠運行。包括安裝向導在內的詳細信息在www.mysql.com。如果你仍然還有這方面的問題,安裝向導能很好的幫助你開始和調試。
2.3.3 MySQL驅動
除了數據庫服務器,在這還需要JDBC驅動。驅動能夠使用Java代碼通過和發送SQL命令到數據庫服務器。驅動是數據庫專用的,但它實現了必須的javax.sql.Driver接口。這個接口保持了JDBC通用性,無須知道是什么數據庫。Hibernate的內核中包裝了JDBC,因此你需要MySQL驅動很好的為你的項目服務。
到http://dev.mysql.com/downloads/找到名為Connector/J的驅動(當前版本是3.1)。選擇最近的發布版本,下載后綴為.zip文件到/applications目錄。解壓.zip文件到這個目錄;它在這個目錄的路徑如/applications/mysql-connector-java-3.16(當然,路徑末尾名稱跟版本匹配)。如果你查看這個目錄,你將發現一個名為mysql-connector-java-3.16-bin.jar的JAR文件,它包含了驅動。
2.4 建立項目
為了幫助闡述怎樣使用Hibernate,你要構建一個簡單的應用程序--Event Calendar 2005,一個 能夠增加事件,日程安排提醒和管理參與者的event/calendar-planning程序。
event calendar程序是Hibernate應用很好的候選者,這有很多原因。日歷和日程安排在許多商業應用中經常使用,因此能為讀者更好的熟悉這個領域。Hibernate的亮點在于能夠應用到多個領域模板。現實的事件應用程序不得不處理許多復雜的關系,包括會議,演講會議,酒店,旅館和會客。
這本書的每一章都會一點點擴展這個應用程序,用Hibernate加入新的關系。但在你開發任何代碼之前,你都需要建立項目。現在你有了所有需要的構建工具(Hibernate,Ant和MySQL數據庫),可以開始了。
2.4.1定義目錄
任何成功的項目第一步是需要一個目錄,安裝以下說明創建:
1 創建一個/work目錄,這是一格基本的存放你將來項目運行的目錄。
2 現在,你需要考慮你的Event Calendar應用程序。因此,創建一個/work/calendar目錄。這個目錄從現在起作為你的項目的惡目錄。
3 在這個目錄中創建一個src/java目錄。你創建的所有Java資源文件將放在這個目錄中。不是.java的資源文件也可以放到這里,如:JSP,SQL,或者Hibernate映射文件(hbm.xml),這個將在下一節說到。
4 打開你喜歡的文本編輯器或者集成開發環境(IDE)3,在目錄中創建一個build.xml文件,暫時讓它空著。這就是你的Event Calendar程序Ant構建文件。
讓我們對你是否做好準備做個快速檢查。如果你都做好了,你將有像下面這樣的目錄結構:
-----------------------------------------------------------------------------------------
/applications/apache-ant-1.6.2
/applications/hibernate-3.0
/applications/mysql
/applications/mysql-connector-java-3.1.6
項目目錄已經建好,讓我們繼續,開發Ant構建文件
2.4.2 Ant 101
你開始的Ant構建文件不必太過于復雜,只要能夠完成基本的步驟就可以了。你將用它來創建目錄,編譯類文件,并且運行類文件。你也將學到幾點關于Ant的重要的概念,包括targets, tasks, paths和properties。
自行鍵入代碼或者你也可以從www.manning.com/peak下載書中的源代碼。找到ch02目錄中的build.xml文件,在你的編輯器中打開(看listing2.1)。遍及這一章,你將在不同的開發階段修改這個文件,最好將不同的版本保存。
Listing 2.1 First Ant build file, 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"/>
<!--定義class-->
<path
id="project.classpath">
<pathelement
location="${build.classes.dir}"/>
</path>
<!-- 創建存放編譯文件的目錄 -->
<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>
<!-- 運行編譯好的類文件 -->
<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>
-------------------------------------------------------------------------------
因為這可能是你的第一個構建文件,讓我們根據這個例子來討論Ant使用的一些概念。
Projects(項目)
我們都知道XML文件格式需要一個根元素,Ant也不例外。基本元素是<project>。正如你所看到的兩個屬性(attribute)是name和default。Name屬性是描述你的項目的名稱,能用任何名字。Default(默認)屬性是指當你運行Ant時調用的target(目標),而不需要在命令好行中特別指出。在這我們調用名為build的target(目標):
<project name="build.xml" default="build">
Property(特性)
特性是Ant的變量。很多項目為一些經常在當前文件中使用的目錄或文件名定義許多特性(最好將這些特性放在項目的首部)。一旦你定義了特性,你就可以使用${property.name}的語句來代替特性值,就像這樣:
<property name="src.java.dir"
location="src/java"/>
用這種方法定義了特性,你就可以隨處使用特性${src.java.dir},否則你需要輸入完整的目錄路徑。特性轉變成關聯的目錄就是:/work/calendar/src/java。關聯目錄例如src/java,通常用于解決build.xml文件中的關聯位置。你定義了兩個特性:一個是你的Java資源文件目錄,另一個是Java文件編譯后的.class文件的目錄。
Paths(路徑)
Paths允許你定義一連串的目錄和/或者任務使用的JAR文件。Path一般定義為.java文件編譯或者運行.class文件的類路徑。用id屬性創建一個<path>元素可以讓你多次重復使用相同的classpath。在這里,我們指定了<path>元素和名為project.classpath的id,并且指定了.class文件的編譯目錄:
-------------------------------------------------------------------------------
<path id="project.classpath">
<pathelement
location="${build.classes.dir}"/>
</path>
------------------------------------------------------------------------------
這個路徑是簡單的-僅僅只是自己的目錄。當你添加更多第三方的JAR文件(如Hibernaete),classpath變得更復雜,Ant的價值也就體現出來。機靈的人能夠很好的掌控classpaths,事實上是Ant幫助他們管理了復雜性的東西。(Classpaths can be tricky
beasts to get right, and the fact that Ant helps manage their complexities is
worth the price of entry)。
Targets(目標)
Targets是Ant的公共方法。它們包含了你將進行的任務。通過將構建文件分成幾個targets,你就能夠更好的組織和管理構建文件了。Targets能夠依賴其它的Targets,如果你指定一個依賴屬性(depends attribute)。當你在執行target之前調用它,Ant就會調用這個target所依賴的其它targets。
在這個文件中,注意依賴“compile target”的“build target”,“compile target”又依賴“init target”。我們能夠這樣輸入:
$ ant build
因為上面那條命令,Ant將執行init, compile和build的targets,這次我們可以用default屬性來演示。關于default屬性可以參考“Projects”部分。因此我們定義“build”為default屬性,輸入:
$ ant
Ant將同樣的執行init,
compile和build的targets一次。
Tasks(任務)
如果targets是Ant的公共方法,那么tasks是它的私有方法和指令。一個構建文件包括幾個tasks,包括一下這些:
n
mkdir創建一個${build.classes.dir}。因此這個目錄僅僅包含了源文件,你能過刪除整個目錄來從新編譯。
n
javac編譯Java文件為.class文件,并且將它們放置在${build.classes.dir}。
n
echo是Ant的“System.out.println()”版本。它輸出消息到命令行。
Tasks的基本使用比較簡單,但你能夠通過配置屬性來豐富你的使用。我們建議你去查看Ant用戶手冊 來獲取完整信息。
2.4.3 運行Ant
現在構建文件已經完成,但還有一個顯而易見遺忘的錯誤:沒有EventCalendar類。讓我們現在就來創建。在src/java目錄下創建一個新的com/manning/hq/ch02的目錄。然后創建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");
}
}
-------------------------------------------------------------------------------
當你運行這個類時,它會歡迎預期的用戶到Event Calendar。(When it runs, your class
welcomes prospective users to the Event Calendar.)
現在你有了所有必須的類,你將運行構建文件了。通過命令行跳轉到存放構建文件的目錄。輸入以下命令:
-------------------------------------------------------------------------------
$ 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
-------------------------------------------------------------------------------
如果你都設置正確,那么你將看到上面相似的畫面。如果你是第一次使用Ant,注意以下幾點:
n
Ant隱式的調用build.xml,因此你不需要輸入構建文件的名稱,但是還是提醒你最好在第一行使用名稱。
n
盡管你從沒有指定調用哪個target,Ant使用project(項目)的default(默認)屬性來調用“build target”。
n
當Ant執行每個target時會顯示target的名稱。這是為什么你會看到:init, compile和build。
n
你定義的大多數tasks都會紀錄自己的信息到日志。
當你看Ant輸出信息時,你不會真的去關心你在<echo>和System.out.println中的信息,你只會關心task是否被執行,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)還記得在構建文件中指定了使用在Ant屬性中的destdir屬性:
<javac destdir=”${build.classes.dir}”/>
你能在構建文件時確定所有的特性建立正確的目錄和文件是個聰明的想法。在這個案例中,通過輸出信息,你能夠知道${build.classes.dir}已經及時轉換/work/calendar/build/classes目錄。
你已經創建了基本的構建文件并且將它放置到正確的位置。在下一節,你將擴展這個例子,加入一些Hibernate文件。
2.5 一些高效率構建文件的習慣
創建一個組織好的,一致的的項目結構需要在開始就考慮構建,但是隨著項目的發展總要增加一些額外的東西。(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在組織項目時具有很大的彈性;但是沒有的結構,因為太有彈性而導致構建更復雜。
開源項目通常發展很快,最新的版本不多久就會發布。為了項目的建立最好獲取Hibernate的最近發布的拷貝,這樣能夠更好的編譯和測試你的最近版本的代碼。
就像Ant的優點一樣,它的一直以來的缺點之一就是在相個項目之間有許多一樣的部分。兩個項目有著自己的構建文件,執行基本相同的步驟,僅僅是目錄不同。例如,如果你想用Hibernate,你將在下一節使用它。為什么還要為了這個項目重寫構建文件(或者只是復制和粘貼)呢?在Ant1.6.2新特點中已經允許你只創建一個構建文件,在你兩個項目中導入和重新使用。這本書的一個目標就是你能創建可在你將來的所有hibernate項目中重用的構建文件。
2.5.1連接Hibernate
在此之前,你已經下載和安裝了Hibernate。現在讓我們在項目中使用它。你需要去修改build.xml文件,讓它通過修飾將Hibernate的JAR文件加入classpath。
更新構建文件
在源代碼中顯示了每一個修改過程,你從而在構建文件的。(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.)如果你想運行這個(而不是修改你現存德構建文件),輸入ant –f build2.xml來指定其他構建文件而不是默認的build.xml。現在打開build.xml顯示修改的部分,如listing2.2。
Listing 2.2 Update build file(build2.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"/>
<!-- ①設置Hibernate版本
-->
<property
name="hibernate.version" value="3.0"/>
<!-- ②設置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>
<!-- 創建存放編譯文件的目錄
-->
<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>
<!-- 運行編譯好的類文件 -->
<target
name="build" depends="compile">
<!-- ⑤使用新的類 -->
<java
classname="com.manning.hq.ch02.EventCalendar2">
<classpath
refid="project.classpath"/>
<!-- ⑥添加Hibernate去運行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>
-------------------------------------------------------------------------------
①通過參數設置你使用的Hibernate的版本號,可以能夠輕易的安裝新版本的Hibernate。只需要下載新版本,從命名已有目錄的版本號數字(例如3.0),并且更新hibernate.version的特性。構建你的項目,確定每一項能工作。不需要復制大量的JAR文件了。
②hibernate.lib.dir顯示了一些比較高級的特性用法;目錄部分時靜態的,而版本號是特性。
③這里你創建了一個新的path元素,包括了hibernate3.jar文件和所有jar包(dependencies---本想翻譯成依賴包,但覺得不合適) 。
④這段代碼添加了在編譯時Hibernate的classpath。
⑤轉變了你將運行的類:com.manning.hq.ch02.EventCalendar2。
⑥這里添加了運行Java文件時Hibernate的classpath。
⑦讓我們清除構建的項目,建立新的框架。
-------------------------------------------------------------------------------
改進的Ant構建文件構造了Hibernate的classpath,使用它運行復雜的Java類程序。
帶Log4j的簡單的類
EventCalendar2在第一個類文件(EventCalendar)上稍微有些改變。它使用了Hibernate和它的jar包中的一些類。現的類文件使用了兩個jar包:一個來自Hibernate,另一個是: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,一個開源的日志框架,紀錄命令行消息日志。然后你創建了一個基本的Hibernate結構(你將在下面章節學到)。這并不沒有達到目標,但足夠用于確定你是否設置好classpath,如果沒設置正確,文件將不能編譯或運行。org.hibernate.cfg.Configuration類來自Hibernate3.jar,org.aparche.log4j.*類來自hibernate/lib目錄下的log4j.jar。最終,你使用Log4j把成功的信息輸出到控制臺。這就確信你已經設置好在classpath中的jar文件。
現在你能夠運行你的構建文件。你將看到:
-------------------------------------------------------------------------------
$ 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
3.0.5
[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
-------------------------------------------------------------------------------
通過命令行,你運行了構建文件中的兩個target。clean target刪除build/classes目錄,構建一個空的build/classese目錄。EventCalendar 和EventCalendar2都成功編譯。Ant然后運行EventCalendar2 Java文件。你成功配置Hibernate就能看到“Welcome to Event Calendar”消息。
2.5.2可重用的構建文件
現在你已經在構建文件中加入Hibernate,這可以證明Ant可重新導入的特點。構建文件包括兩個可重用塊:fileset和定義Hibernate安裝位置的path元素。他們遍歷Hibernate目錄,然后定義需要的JAR文件位置。構建文件通過可重用使用在其他的項目上。如果以后你更新Hibernate的版本,你就能輕松的在build.xml中指向提取的新的版本的新目錄,然后就可以了。
記下來時創建新的文件,hibernate-build.xml,基于你的可重用的構建文件。你將從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>
-------------------------------------------------------------------------------
這是個完整的構建文件。從一個內部特定的目錄開始,${hibernate.lib.dir},構建classpath。它允許hibernate-build.xml導入到項目中去,它特指了Hibernate的安裝位置,能夠使用path就像它是構建文件項目的一部分。下面,修改你的build.xml文件,導入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直接導入build.xml。hibernate.lib.path仍然在build.xml定義。測試并運行:
----------------------------------------------------------------------------------------------------------------------
$ 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 3.0.5
[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
----------------------------------------------------------------------------------------------------------------------
成功的運行修改了的文件就會看到以上這些輸出。Ant運行了javac 和java task,這些task依賴成功配置hibernate.lib.path。
但是構建文件會不會失敗呢?如果你看到以下的內容,就表示導入不正確。
-------------------------------------------------------------------------------
$ 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
-------------------------------------------------------------------------------
雙擊檢查你是否已經導入hibernate-build.xml文件,構建文件包含了hibernate.lib.path的配置。
2.5.3擴展
這一章僅討論了一些基本的Ant工作原理,示范了基本的構建文件。這已經有足夠的信息去開始了,這里還有一些值得做的事情。查看Ant用戶手冊(特別是,Ant核心tasks),你將學到更多特定的task例如:import和javac。
2.6 總結
在這一章,我們學到了基本的建立Hibernate的步驟,包括獲得Hibernate,MySQL數據庫和Ant構建工具。Hibernate發布版本是個大的zip文件;它包括文檔,資源代碼和JAR文件,包括基本的hibernate3.jar和所有Hibernate依賴的JAR文件。為了獲得更多信息,你能夠在Hibernate主頁www.hibernate.org找到;包括用戶手冊和社區,這是兩個非常有用的資源。
Ant是Java構建工具。它允許開發者在任何平臺構建重復的項目。它的主頁的地址:http://ant.apache.org。Ant使用XML文件定義構建過程步驟。默認的命名為build.xml。Ant1.6能夠將構建文件最為模板和可重用在不同項目中。
Hibernate能夠使用在大多數數據庫上,包括MySQl,只要有JDBC驅動。MySQL是最普遍的開源數據庫,地址:www.mysql.com。
1、 什么是Wiki? 可以把它認為是一個參業者可以閱讀,學習,發表自己的觀點的巨大的多人互動的社區網站。瀏覽http://c2.com/cgi/wiki?WikiWikiWeb官方網站,獲取更多信息。
2、 在我們的觀點中,Ant使用手冊(http://ant.aparche.org/manual/index.html)是最好的文檔之一,它有著很好的例子,這在相對貧乏的開源項目文檔中是少有的。它除了顯示變量參數和任務之外,還為每個任務提供了例子,你能夠輕松的復制和修改。
3、 討論一個“優秀”的IDE必會像在午餐桌上談論宗教或者政治發生爭論。現在大多數IDE都集成了Ant,甚至有Hibernate插件,這樣能夠更容易管理項目。作者比較偏愛IDEA(www.intellij.com)和Eclipse(www.eclipse.org/)。
posted on 2005-11-13 22:13
千山鳥飛絕 閱讀(7108)
評論(4) 編輯 收藏 所屬分類:
Hibernate