JAVA涂鸦
关于JAVA的点点滴滴
posts - 50,  comments - 689,  trackbacks - 0
    这是节选了《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         在这之前,你没有安装AntHibernate,或者任一数据库(MySQL)。这一章将讲述这些,如果你已经有或者直到安装这些程序,可以轻松粗略看这一章或跳到第三章。你可能需要注意你的这些程序安装位置,因为所有示例都是建立这章的基础上。

注意:这个章节的大多数例子包括运行AntMySQL都是使用命令行调用,这些例子可以在WindowsUnix,LinuxMacintoshes上运行。为避免混乱,所有命令行使用普通的$的命令提示符(来自Mac),这比为每个平台重复例子好。那好,让我们看看这里:

   $ ant clean build

它基本相当于:

    C:\applications\ant clean build

针对每个不同的平台,请参考该平台上工具的文档说明。

 

注意:在路径中,我们使用具有代表性的正斜杠(/)代替Windows平台的反斜杠(\),如果你使用的是Windows平台,只需要反转斜杠就可以了。

 

2.1获得hibernate发布版本。

   在创建你的hibernate项目的第一步就是从网站上获取最新的拷贝。去hibernate官方网站www.hibernate.org,这里有丰富的信息,包括可靠的参考文档,邮件列表和活跃的社区Wiki1 。现在,我们只需要编程,点击主目录的下载连接,选择最近的3.xhibernate发布版本。Hibernate发布版本有两种类型:.zip.tar.gz

    选择适合你的平台的版本(Windows用户最好选择.zip类型,Linux/Unix选择.tar.gz类型),然后选择离你最近的镜像站点,从类似图2.1的列表中选择。

ant1.jpg

2.1 从镜像站点中选择hibernate发布版本。

 

    当你下载好hibernate,创建一个应用程序目录用来存放解压的hibernate。在Windows,创建C:\applications目录。在Linux/Unix,创建/applications。解压hibernate的发布版本到这个目录下。在Windows ,你可以看到hibernateC:\applications\hibernate-3.0看到如图2.2所示:

   ant2.jpg

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!

    Build failed

 

    正如你所见,ant给你一个错误提示,因为它需要一个叫build.xml的构建文件。

    有了Ant,你就可以开始使用构建文件(典型称谓build.xml)创建你的项目。我们将在2.4节开始。在此之前,你还需要你个数据库。

 

2.3建立数据库

    Hibernate是个几乎无缝连接你的Java项目到数据库。定义一个映射文件,它能够自动在内存和持久化文件系统(平常使用的数据库)之间把对象和SQLstatement来回转换。

    如果你使用过SQL,并不是所有的数据库的SQL是一致的。尽管SQL是一个技术标准,但每个数据库提供商都有自己些许不同的“标准”版本。使用hibernate,你可以避免编写提供商特定的JDBC代码。你能够写一个普通的应用程序在任何数据库部署,例如:OracleMySQL或者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服务器。

    另外,如果你安装了防火墙,例如:诺顿网络安全特警,你需要配置防火墙允许从你的IP127.0.0.1loaclhost)当前电脑连接到端口号为3306MySQL服务器。

 

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自带的数据库(mysqltest)

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.jarJAR文件,它包含了驱动。

 

2.4 建立项目

为了帮助阐述怎样使用Hibernate,你要构建一个简单的应用程序--Event Calendar 2005,一个 能够增加事件,日程安排提醒和管理参与者的event/calendar-planning程序。

    event calendar程序是Hibernate应用很好的候选者,这有很多原因。日历和日程安排在许多商业应用中经常使用,因此能为读者更好的熟悉这个领域。Hibernate的亮点在于能够应用到多个领域模板。现实的事件应用程序不得不处理许多复杂的关系,包括会议,演讲会议,酒店,旅馆和会客。

    这本书的每一章都会一点点扩展这个应用程序,用Hibernate加入新的关系。但在你开发任何代码之前,你都需要建立项目。现在你有了所有需要的构建工具(HibernateAntMySQL数据库),可以开始了。

 

2.4.1定义目录

    任何成功的项目第一步是需要一个目录,安装以下说明创建:

    1 创建一个/work目录,这是一格基本的存放你将来项目运行的目录。

2 现在,你需要考虑你的Event Calendar应用程序。因此,创建一个/work/calendar目录。这个目录从现在起作为你的项目的恶目录。

3 在这个目录中创建一个src/java目录。你创建的所有Java资源文件将放在这个目录中。不是.java的资源文件也可以放到这里,如:JSPSQL,或者Hibernate映射文件(hbm.xml),这个将在下一节说到。

4 打开你喜欢的文本编辑器或者集成开发环境(IDE3,在目录中创建一个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, pathsproperties

    自行键入代码或者你也可以从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)是namedefaultName属性是描述你的项目的名称,能用任何名字。Default(默认)属性是指当你运行Ant时调用的target(目标),而不需要在命令好行中特别指出。在这我们调用名为buildtarget(目标):

    <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.classpathid,并且指定了.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(目标)

    TargetsAnt的公共方法。它们包含了你将进行的任务。通过将构建文件分成几个targets,你就能够更好的组织和管理构建文件了。Targets能够依赖其它的Targets,如果你指定一个依赖属性(depends attribute)。当你在执行target之前调用它,Ant就会调用这个target所依赖的其它targets

    在这个文件中,注意依赖“compile target”的“build target”,“compile target”又依赖“init target”。我们能够这样输入:

    $ ant build

    因为上面那条命令,Ant将执行init, compilebuildtargets,这次我们可以用default属性来演示。关于default属性可以参考“Projects”部分。因此我们定义“build”为default属性,输入:

    $ ant

    Ant将同样的执行init, compilebuildtargets一次。

Tasks(任务)

    如果targetsAnt的公共方法,那么tasks是它的私有方法和指令。一个构建文件包括几个tasks,包括一下这些:

n         mkdir创建一个${build.classes.dir}。因此这个目录仅仅包含了源文件,你能过删除整个目录来从新编译。

n         javac编译Java文件为.class文件,并且将它们放置在${build.classes.dir}

n         echoAnt的“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         尽管你从没有指定调用哪个targetAnt使用project(项目)的default(默认)属性来调用“build target”。

n         Ant执行每个target时会显示target的名称。这是为什么你会看到:init, compilebuild

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文件,让它通过修饰将HibernateJAR文件加入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---本想翻译成依赖包,但觉得不合适)

这段代码添加了在编译时Hibernateclasspath

转变了你将运行的类:com.manning.hq.ch02.EventCalendar2

这里添加了运行Java文件时Hibernateclasspath

让我们清除构建的项目,建立新的框架。

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

改进的Ant构建文件构造了Hibernateclasspath,使用它运行复杂的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.jarorg.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

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

    通过命令行,你运行了构建文件中的两个targetclean 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.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>

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

这是个完整的构建文件。从一个内部特定的目录开始,${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.xmlhibernate.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例如:importjavac

 

2.6 总结

在这一章,我们学到了基本的建立Hibernate的步骤,包括获得HibernateMySQL数据库和Ant构建工具。Hibernate发布版本是个大的zip文件;它包括文档,资源代码和JAR文件,包括基本的hibernate3.jar和所有Hibernate依赖的JAR文件。为了获得更多信息,你能够在Hibernate主页www.hibernate.org找到;包括用户手册和社区,这是两个非常有用的资源。

    AntJava构建工具。它允许开发者在任何平台构建重复的项目。它的主页的地址:http://ant.apache.orgAnt使用XML文件定义构建过程步骤。默认的命名为build.xmlAnt1.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插件,这样能够更容易管理项目。作者比较偏爱IDEAwww.intellij.com)和Eclipsewww.eclipse.org/)。

 


posted on 2005-11-13 22:13 千山鸟飞绝 阅读(7099) 评论(4)  编辑  收藏 所属分类: Hibernate

FeedBack:
# re: 用Ant安装和构建Hibernate项目
2006-01-02 11:46 | kielin
您有这本书E版吗?
能不能发给我看看,非常谢谢
我的E-mail是:ekin.john@gmail.com 或者 jiangyq_2001@hotmail.com  回复  更多评论
  
# re: 用Ant安装和构建Hibernate项目
2006-04-21 20:51 | wuqingzhu
这个小例子写的不错,
很详细,很细心,
是一个很好的入门的帮助,

谢谢楼主哦,
有好东西招呼一下,
QQ:448272734

Think You!!  回复  更多评论
  
# re: 用Ant安装和构建Hibernate项目
2006-12-19 12:20 | 早班鸟
很不错的入门指导,谢谢!  回复  更多评论
  
# re: 用Ant安装和构建Hibernate项目
2007-01-08 01:08 | 癞蛤蟆的左眼
我在Hibernate中的xml文件中定义了双向映射,并附加了一个元素one-to-many产生的Set元素,并在持久化类用getSubSubject()取到了定义的Set集合,强制转化成list行吗?

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

程序没有报错,但验证时发现getSubSubjects()取不出东西 ,而且一使用它就报错 ,请问你遇到过吗?  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
正在阅读:



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

常用链接

留言簿(35)

随笔档案

文章分类

文章档案

好友的blog

我的其他blog

老婆的Blog

搜索

  •  

积分与排名

  • 积分 - 773342
  • 排名 - 56

最新评论

阅读排行榜

评论排行榜