JAVA涂鴉
          關(guān)于JAVA的點(diǎn)點(diǎn)滴滴
          posts - 50,  comments - 689,  trackbacks - 0
              這是節(jié)選了《Manning.Hibernate.Quickly.Aug.2005》的第二章。這一章說了很多基本的知識,特別是Ant,這個構(gòu)建工具在開發(fā)項(xiàng)目中非常有用。
              由于水品有限,翻譯得比較直白,一些語句還無法斷定,所以同時寫上原文語句供大家參考。
              個人覺得還是看得懂的,希望對大家有用。

          2

          Ant安裝和構(gòu)建項(xiàng)目

          這一章包括:

                  獲取和安裝hibernate

                  安裝和學(xué)習(xí)基本的Ant知識

                  建立和測試MySQL

                  使用Ant創(chuàng)建一個基本的項(xiàng)目

           

          我們通過前面的示例認(rèn)識到對開發(fā)者來說hibernate是一個非常有用的工具。在這一章我們將討論如何獲得工具,建立項(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,一個非常流行的開源數(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)建一個基本的項(xiàng)目,這將為更多復(fù)雜項(xiàng)目作為模板使用。

          完成這些目標(biāo)可以使你在后面的章節(jié)中更好的領(lǐng)會hibernate思想。另外,你也可以很輕松的完成一個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         在這之前,你沒有安裝AntHibernate,或者任一數(shù)據(jù)庫(MySQL)。這一章將講述這些,如果你已經(jīng)有或者直到安裝這些程序,可以輕松粗略看這一章或跳到第三章。你可能需要注意你的這些程序安裝位置,因?yàn)樗惺纠际墙⑦@章的基礎(chǔ)上。

          注意:這個章節(jié)的大多數(shù)例子包括運(yùn)行AntMySQL都是使用命令行調(diào)用,這些例子可以在WindowsUnix,LinuxMacintoshes上運(yùn)行。為避免混亂,所有命令行使用普通的$的命令提示符(來自Mac),這比為每個平臺重復(fù)例子好。那好,讓我們看看這里:

             $ ant clean build

          它基本相當(dāng)于:

              C:\applications\ant clean build

          針對每個不同的平臺,請參考該平臺上工具的文檔說明。

           

          注意:在路徑中,我們使用具有代表性的正斜杠(/)代替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.xhibernate發(fā)布版本。Hibernate發(fā)布版本有兩種類型:.zip.tar.gz

              選擇適合你的平臺的版本(Windows用戶最好選擇.zip類型,Linux/Unix選擇.tar.gz類型),然后選擇離你最近的鏡像站點(diǎn),從類似圖2.1的列表中選擇。

          ant1.jpg

          2.1 從鏡像站點(diǎn)中選擇hibernate發(fā)布版本。

           

              當(dāng)你下載好hibernate,創(chuàng)建一個應(yīng)用程序目錄用來存放解壓的hibernate。在Windows,創(chuàng)建C:\applications目錄。在Linux/Unix,創(chuàng)建/applications。解壓hibernate的發(fā)布版本到這個目錄下。在Windows ,你可以看到hibernateC:\applications\hibernate-3.0看到如圖2.2所示:

             ant2.jpg

          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)備這些時就會涉及構(gòu)建過程。(the steps that developers take to put everything together are typically referred as build process.)每次手動進(jìn)行這些時,開發(fā)者不得不面對構(gòu)建項(xiàng)目,這樣可能會用錯誤命令的調(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.)為了避免這些手動錯誤,你需要構(gòu)建工具,能過讓程序自動構(gòu)建。對Java而言,Ant是普遍的選擇。

              自從Ant創(chuàng)建以來,它證明了自己在各種各樣的Java項(xiàng)目中的價值,并且成為了Java的著名的標(biāo)準(zhǔn)的構(gòu)建工具。因此它是幫你構(gòu)建hibernate項(xiàng)目最好的選擇。首先,我們得獲得一份拷貝。

           

          2.2.1獲得Ant

              Ant的主頁是http://ant.aparche.org/。宿主在Aparche軟件基金主機(jī)上,在這有許多著名的開源項(xiàng)目,包括Aparche HTTP server。在這個網(wǎng)站上有許多有用的信息,特別是優(yōu)秀的Ant用戶手冊2。點(diǎn)擊左邊主菜單的Ant二進(jìn)制發(fā)布版本,選擇最新的版本(有.zip,.tar.gz或者tar.bz2格式)(目前最新是1.6.2版本),下載保存。

           

          2.2.2解壓和安裝Ant

              下載完畢后,解壓Ant到你最新創(chuàng)建的applications目錄。Ant是個典型的用命令行運(yùn)行的工具。安裝Ant需要一些配置步驟。你需要定義一個指向Ant目錄的環(huán)境變量(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!

              Build failed

           

              正如你所見,ant給你一個錯誤提示,因?yàn)樗枰粋€叫build.xml的構(gòu)建文件。

              有了Ant,你就可以開始使用構(gòu)建文件(典型稱謂build.xml)創(chuàng)建你的項(xiàng)目。我們將在2.4節(jié)開始。在此之前,你還需要你個數(shù)據(jù)庫。

           

          2.3建立數(shù)據(jù)庫

              Hibernate是個幾乎無縫連接你的Java項(xiàng)目到數(shù)據(jù)庫。定義一個映射文件,它能夠自動在內(nèi)存和持久化文件系統(tǒng)(平常使用的數(shù)據(jù)庫)之間把對象和SQLstatement來回轉(zhuǎn)換。

              如果你使用過SQL,并不是所有的數(shù)據(jù)庫的SQL是一致的。盡管SQL是一個技術(shù)標(biāo)準(zhǔn),但每個數(shù)據(jù)庫提供商都有自己些許不同的“標(biāo)準(zhǔn)”版本。使用hibernate,你可以避免編寫提供商特定的JDBC代碼。你能夠?qū)懸粋€普通的應(yīng)用程序在任何數(shù)據(jù)庫部署,例如:OracleMySQL或者SQL Server。只要你不寫自己的數(shù)據(jù)庫引擎,hibernate能夠很好的工作。

              在我們的示例程序中,你將使用MySQL-一個開發(fā)者非常了解的流行的開源數(shù)據(jù)庫。你需要考慮到一點(diǎn):MySQL 4.0及以下版本不支持hibernate有時需要使用的子查詢。你可以使用老的版本;但在寫查詢語句有些不同。為了避免復(fù)雜化,這一章的例子使用支持子查詢的MySQL 4.1

           

          2.3.1 獲得MySQL

              安裝MySQL是個復(fù)雜的過程,因此我們僅僅介紹在Windows的基本安裝。完整的文檔說明在http://dev.mysql.com/doc/。幸運(yùn)的是,從MySQL 4.1.5開始安裝更加簡單;這里有適合你的Windows安裝版本。

              http://dev.mysql.com/downloads/獲得一份MySQL 4.1(或者更新)拷貝。選擇MySQL數(shù)據(jù)庫服務(wù),選擇適合你的平臺的二進(jìn)制版本,然后下載。運(yùn)行安裝。在安裝過程中,選擇作為Windows服務(wù)安裝MySQL,這樣做可以避免手動從命令行啟動MySQL服務(wù)器。

              另外,如果你安裝了防火墻,例如:諾頓網(wǎng)絡(luò)安全特警,你需要配置防火墻允許從你的IP127.0.0.1loaclhost)當(dāng)前電腦連接到端口號為3306MySQL服務(wù)器。

           

          2.3.2測試MySQL

                 讓我們證明MySQL正在工作:

                 1 打開另外一個命令控制臺,在這個控制臺我們可以使用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要求輸入密碼時,你可以敲擊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: 4.1.10-nt Type ‘help;’ or ‘\h’ for help. Type ‘\c’to clear the buffer.

          5 Hibernate的使用創(chuàng)建一個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ù)庫(mysqltest)

          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)試。

           

          2.3.3 MySQL驅(qū)動

          除了數(shù)據(jù)庫服務(wù)器,在這還需要JDBC驅(qū)動。驅(qū)動能夠使用Java代碼通過和發(fā)送SQL命令到數(shù)據(jù)庫服務(wù)器。驅(qū)動是數(shù)據(jù)庫專用的,但它實(shí)現(xiàn)了必須的javax.sql.Driver接口。這個接口保持了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文件到這個目錄;它在這個目錄的路徑如/applications/mysql-connector-java-3.16(當(dāng)然,路徑末尾名稱跟版本匹配)。如果你查看這個目錄,你將發(fā)現(xiàn)一個名為mysql-connector-java-3.16-bin.jarJAR文件,它包含了驅(qū)動。

           

          2.4 建立項(xiàng)目

          為了幫助闡述怎樣使用Hibernate,你要構(gòu)建一個簡單的應(yīng)用程序--Event Calendar 2005,一個 能夠增加事件,日程安排提醒和管理參與者的event/calendar-planning程序。

              event calendar程序是Hibernate應(yīng)用很好的候選者,這有很多原因。日歷和日程安排在許多商業(yè)應(yīng)用中經(jīng)常使用,因此能為讀者更好的熟悉這個領(lǐng)域。Hibernate的亮點(diǎn)在于能夠應(yīng)用到多個領(lǐng)域模板。現(xiàn)實(shí)的事件應(yīng)用程序不得不處理許多復(fù)雜的關(guān)系,包括會議,演講會議,酒店,旅館和會客。

              這本書的每一章都會一點(diǎn)點(diǎn)擴(kuò)展這個應(yīng)用程序,用Hibernate加入新的關(guān)系。但在你開發(fā)任何代碼之前,你都需要建立項(xiàng)目。現(xiàn)在你有了所有需要的構(gòu)建工具(HibernateAntMySQL數(shù)據(jù)庫),可以開始了。

           

          2.4.1定義目錄

              任何成功的項(xiàng)目第一步是需要一個目錄,安裝以下說明創(chuàng)建:

              1 創(chuàng)建一個/work目錄,這是一格基本的存放你將來項(xiàng)目運(yùn)行的目錄。

          2 現(xiàn)在,你需要考慮你的Event Calendar應(yīng)用程序。因此,創(chuàng)建一個/work/calendar目錄。這個目錄從現(xiàn)在起作為你的項(xiàng)目的惡目錄。

          3 在這個目錄中創(chuàng)建一個src/java目錄。你創(chuàng)建的所有Java資源文件將放在這個目錄中。不是.java的資源文件也可以放到這里,如:JSPSQL,或者Hibernate映射文件(hbm.xml),這個將在下一節(jié)說到。

          4 打開你喜歡的文本編輯器或者集成開發(fā)環(huán)境(IDE3,在目錄中創(chuàng)建一個build.xml文件,暫時讓它空著。這就是你的Event Calendar程序Ant構(gòu)建文件。

           

          讓我們對你是否做好準(zhǔn)備做個快速檢查。如果你都做好了,你將有像下面這樣的目錄結(jié)構(gòu):

          -----------------------------------------------------------------------------------------
          /applications/apache-ant-1.6.2

          /applications/hibernate-3.0

          /applications/mysql

          /applications/mysql-connector-java-3.1.6

          項(xiàng)目目錄已經(jīng)建好,讓我們繼續(xù),開發(fā)Ant構(gòu)建文件

           

          2.4.2 Ant 101

              你開始的Ant構(gòu)建文件不必太過于復(fù)雜,只要能夠完成基本的步驟就可以了。你將用它來創(chuàng)建目錄,編譯類文件,并且運(yùn)行類文件。你也將學(xué)到幾點(diǎn)關(guān)于Ant的重要的概念,包括targets, tasks, pathsproperties

              自行鍵入代碼或者你也可以從www.manning.com/peak下載書中的源代碼。找到ch02目錄中的build.xml文件,在你的編輯器中打開(看listing2.1)。遍及這一章,你將在不同的開發(fā)階段修改這個文件,最好將不同的版本保存。

          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òu)建文件,讓我們根據(jù)這個例子來討論Ant使用的一些概念。

          Projects(項(xiàng)目)

              我們都知道XML文件格式需要一個根元素,Ant也不例外。基本元素是<project>。正如你所看到的兩個屬性(attribute)是namedefaultName屬性是描述你的項(xiàng)目的名稱,能用任何名字。Default(默認(rèn))屬性是指當(dāng)你運(yùn)行Ant時調(diào)用的target(目標(biāo)),而不需要在命令好行中特別指出。在這我們調(diào)用名為buildtarget(目標(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)位置。你定義了兩個特性:一個是你的Java資源文件目錄,另一個是Java文件編譯后的.class文件的目錄。

          Paths(路徑)

              Paths允許你定義一連串的目錄和/或者任務(wù)使用的JAR文件。Path一般定義為.java文件編譯或者運(yùn)行.class文件的類路徑。用id屬性創(chuàng)建一個<path>元素可以讓你多次重復(fù)使用相同的classpath。在這里,我們指定了<path>元素和名為project.classpathid,并且指定了.class文件的編譯目錄:

          -------------------------------------------------------------------------------

          <path id="project.classpath">

              <pathelement location="${build.classes.dir}"/>

          </path>

          ------------------------------------------------------------------------------

              這個路徑是簡單的-僅僅只是自己的目錄。當(dāng)你添加更多第三方的JAR文件(如Hibernaete),classpath變得更復(fù)雜,Ant的價值也就體現(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))

              TargetsAnt的公共方法。它們包含了你將進(jìn)行的任務(wù)。通過將構(gòu)建文件分成幾個targets,你就能夠更好的組織和管理構(gòu)建文件了。Targets能夠依賴其它的Targets,如果你指定一個依賴屬性(depends attribute)。當(dāng)你在執(zhí)行target之前調(diào)用它,Ant就會調(diào)用這個target所依賴的其它targets

              在這個文件中,注意依賴“compile target”的“build target”,“compile target”又依賴“init target”。我們能夠這樣輸入:

              $ ant build

              因?yàn)樯厦婺菞l命令,Ant將執(zhí)行init, compilebuildtargets,這次我們可以用default屬性來演示。關(guān)于default屬性可以參考“Projects”部分。因此我們定義“build”為default屬性,輸入:

              $ ant

              Ant將同樣的執(zhí)行init, compilebuildtargets一次。

          Tasks(任務(wù))

              如果targetsAnt的公共方法,那么tasks是它的私有方法和指令。一個構(gòu)建文件包括幾個tasks,包括一下這些:

          n         mkdir創(chuàng)建一個${build.classes.dir}。因此這個目錄僅僅包含了源文件,你能過刪除整個目錄來從新編譯。

          n         javac編譯Java文件為.class文件,并且將它們放置在${build.classes.dir}

          n         echoAnt的“System.out.println()”版本。它輸出消息到命令行。

          Tasks的基本使用比較簡單,但你能夠通過配置屬性來豐富你的使用。我們建議你去查看Ant用戶手冊 來獲取完整信息。

           

          2.4.3 運(yùn)行Ant

              現(xiàn)在構(gòu)建文件已經(jīng)完成,但還有一個顯而易見遺忘的錯誤:沒有EventCalendar類。讓我們現(xiàn)在就來創(chuàng)建。在src/java目錄下創(chuàng)建一個新的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)行這個類時,它會歡迎預(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)用哪個targetAnt使用project(項(xiàng)目)的default(默認(rèn))屬性來調(diào)用“build target”。

          n         當(dāng)Ant執(zhí)行每個target時會顯示target的名稱。這是為什么你會看到:init, compilebuild

          n         你定義的大多數(shù)tasks都會紀(jì)錄自己的信息到日志。

          當(dāng)你看Ant輸出信息時,你不會真的去關(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)建文件時確定所有的特性建立正確的目錄和文件是個聰明的想法。在這個案例中,通過輸出信息,你能夠知道${build.classes.dir}已經(jīng)及時轉(zhuǎn)換/work/calendar/build/classes目錄。

          你已經(jīng)創(chuàng)建了基本的構(gòu)建文件并且將它放置到正確的位置。在下一節(jié),你將擴(kuò)展這個例子,加入一些Hibernate文件。

           

          2.5 一些高效率構(gòu)建文件的習(xí)慣

          創(chuàng)建一個組織好的,一致的的項(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)目時具有很大的彈性;但是沒有的結(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)之一就是在相個項(xiàng)目之間有許多一樣的部分。兩個項(xiàng)目有著自己的構(gòu)建文件,執(zhí)行基本相同的步驟,僅僅是目錄不同。例如,如果你想用Hibernate,你將在下一節(jié)使用它。為什么還要為了這個項(xiàng)目重寫構(gòu)建文件(或者只是復(fù)制和粘貼)呢?在Ant1.6.2新特點(diǎn)中已經(jīng)允許你只創(chuàng)建一個構(gòu)建文件,在你兩個項(xiàng)目中導(dǎo)入和重新使用。這本書的一個目標(biāo)就是你能創(chuàng)建可在你將來的所有hibernate項(xiàng)目中重用的構(gòu)建文件。

           

          2.5.1連接Hibernate

          在此之前,你已經(jīng)下載和安裝了Hibernate。現(xiàn)在讓我們在項(xiàng)目中使用它。你需要去修改build.xml文件,讓它通過修飾將HibernateJAR文件加入classpath

           

          更新構(gòu)建文件

              在源代碼中顯示了每一個修改過程,你從而在構(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)行這個(而不是修改你現(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顯示了一些比較高級的特性用法;目錄部分時靜態(tài)的,而版本號是特性。

          這里你創(chuàng)建了一個新的path元素,包括了hibernate3.jar文件和所有jar(dependencies---本想翻譯成依賴包,但覺得不合適)

          這段代碼添加了在編譯時Hibernateclasspath

          轉(zhuǎn)變了你將運(yùn)行的類:com.manning.hq.ch02.EventCalendar2

          這里添加了運(yùn)行Java文件時Hibernateclasspath

          讓我們清除構(gòu)建的項(xiàng)目,建立新的框架。

          -------------------------------------------------------------------------------

          改進(jìn)的Ant構(gòu)建文件構(gòu)造了Hibernateclasspath,使用它運(yùn)行復(fù)雜的Java類程序。

           

          Log4j的簡單的類

              EventCalendar2在第一個類文件(EventCalendar)上稍微有些改變。它使用了Hibernate和它的jar包中的一些類。現(xiàn)的類文件使用了兩個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,一個開源的日志框架,紀(jì)錄命令行消息日志。然后你創(chuàng)建了一個基本的Hibernate結(jié)構(gòu)(你將在下面章節(jié)學(xué)到)。這并不沒有達(dá)到目標(biāo),但足夠用于確定你是否設(shè)置好classpath,如果沒設(shè)置正確,文件將不能編譯或運(yùn)行。org.hibernate.cfg.Configuration類來自Hibernate3.jarorg.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 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

          -------------------------------------------------------------------------------

              通過命令行,你運(yùn)行了構(gòu)建文件中的兩個targetclean target刪除build/classes目錄,構(gòu)建一個空的build/classese目錄。EventCalendar EventCalendar2都成功編譯。Ant然后運(yùn)行EventCalendar2 Java文件。你成功配置Hibernate就能看到“Welcome to Event Calendar”消息。

           

          2.5.2可重用的構(gòu)建文件

              現(xiàn)在你已經(jīng)在構(gòu)建文件中加入Hibernate,這可以證明Ant可重新導(dǎo)入的特點(diǎn)。構(gòu)建文件包括兩個可重用塊:fileset和定義Hibernate安裝位置的path元素。他們遍歷Hibernate目錄,然后定義需要的JAR文件位置。構(gòu)建文件通過可重用使用在其他的項(xiàng)目上。如果以后你更新Hibernate的版本,你就能輕松的在build.xml中指向提取的新的版本的新目錄,然后就可以了。

          記下來時創(chuàng)建新的文件,hibernate-build.xml,基于你的可重用的構(gòu)建文件。你將從build.xml文件中提取hibernate.lib.pathhibernate-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òu)建文件。從一個內(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.xmlhibernate.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 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

          ----------------------------------------------------------------------------------------------------------------------

          成功的運(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的配置。

           

          2.5.3擴(kuò)展

              這一章僅討論了一些基本的Ant工作原理,示范了基本的構(gòu)建文件。這已經(jīng)有足夠的信息去開始了,這里還有一些值得做的事情。查看Ant用戶手冊(特別是,Ant核心tasks),你將學(xué)到更多特定的task例如:importjavac

           

          2.6 總結(jié)

          在這一章,我們學(xué)到了基本的建立Hibernate的步驟,包括獲得HibernateMySQL數(shù)據(jù)庫和Ant構(gòu)建工具。Hibernate發(fā)布版本是個大的zip文件;它包括文檔,資源代碼和JAR文件,包括基本的hibernate3.jar和所有Hibernate依賴的JAR文件。為了獲得更多信息,你能夠在Hibernate主頁www.hibernate.org找到;包括用戶手冊和社區(qū),這是兩個非常有用的資源。

              AntJava構(gòu)建工具。它允許開發(fā)者在任何平臺構(gòu)建重復(fù)的項(xiàng)目。它的主頁的地址:http://ant.apache.orgAnt使用XML文件定義構(gòu)建過程步驟。默認(rèn)的命名為build.xmlAnt1.6能夠?qū)?gòu)建文件最為模板和可重用在不同項(xiàng)目中。

              Hibernate能夠使用在大多數(shù)數(shù)據(jù)庫上,包括MySQl,只要有JDBC驅(qū)動。MySQL是最普遍的開源數(shù)據(jù)庫,地址:www.mysql.com

           

           

          1、  什么是Wiki? 可以把它認(rèn)為是一個參業(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ù)之外,還為每個任務(wù)提供了例子,你能夠輕松的復(fù)制和修改。

          3、  討論一個“優(yōu)秀”的IDE必會像在午餐桌上談?wù)撟诮袒蛘哒伟l(fā)生爭論。現(xiàn)在大多數(shù)IDE都集成了Ant,甚至有Hibernate插件,這樣能夠更容易管理項(xiàng)目。作者比較偏愛IDEAwww.intellij.com)和Eclipsewww.eclipse.org/)。

           


          posted on 2005-11-13 22:13 千山鳥飛絕 閱讀(7116) 評論(4)  編輯  收藏 所屬分類: Hibernate

          FeedBack:
          # re: 用Ant安裝和構(gòu)建Hibernate項(xiàng)目
          2006-01-02 11:46 | kielin
          您有這本書E版嗎?
          能不能發(fā)給我看看,非常謝謝
          我的E-mail是:ekin.john@gmail.com 或者 jiangyq_2001@hotmail.com  回復(fù)  更多評論
            
          # re: 用Ant安裝和構(gòu)建Hibernate項(xiàng)目
          2006-04-21 20:51 | wuqingzhu
          這個小例子寫的不錯,
          很詳細(xì),很細(xì)心,
          是一個很好的入門的幫助,

          謝謝樓主哦,
          有好東西招呼一下,
          QQ:448272734

          Think You!!  回復(fù)  更多評論
            
          # re: 用Ant安裝和構(gòu)建Hibernate項(xiàng)目
          2006-12-19 12:20 | 早班鳥
          很不錯的入門指導(dǎo),謝謝!  回復(fù)  更多評論
            
          # re: 用Ant安裝和構(gòu)建Hibernate項(xiàng)目
          2007-01-08 01:08 | 癩蛤蟆的左眼
          我在Hibernate中的xml文件中定義了雙向映射,并附加了一個元素one-to-many產(chǎn)生的Set元素,并在持久化類用getSubSubject()取到了定義的Set集合,強(qiáng)制轉(zhuǎn)化成list行嗎?

          List list = (List)getSubSubject(); //Set getSubSubject() 是持久化類中提供的
          return list;

          程序沒有報錯,但驗(yàn)證時發(fā)現(xiàn)getSubSubjects()取不出東西 ,而且一使用它就報錯 ,請問你遇到過嗎?  回復(fù)  更多評論
            
          正在閱讀:



          <2007年1月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(35)

          隨筆檔案

          文章分類

          文章檔案

          好友的blog

          我的其他blog

          老婆的Blog

          搜索

          •  

          積分與排名

          • 積分 - 776345
          • 排名 - 56

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 武陟县| 南昌县| 巴马| 财经| 浠水县| 苏尼特左旗| 根河市| 修文县| 财经| 滦南县| 金寨县| 普定县| 孝义市| 五常市| 杭锦后旗| 牙克石市| 白山市| 大庆市| 河间市| 如皋市| 密云县| 左云县| 黄大仙区| 红原县| 南丹县| 三明市| 杭州市| 洱源县| 民县| 寿阳县| 成都市| 阜新市| 泸西县| 射阳县| 新龙县| 景东| 大城县| 兰溪市| 鄄城县| 义马市| 德阳市|