返回介绍

建立项目层次结构

发布于 2025-04-21 21:42:11 字数 16619 浏览 0 评论 0 收藏

虽然起步只是一小步,但是,当我们开始设计数据结构,并创建用于表示它们的 Java 类和数据库表(database table),再配合所有配置文件和控制文件,将全部内容整合起来以发挥作用时,我们最后还是会得到一大堆文件。所以,起步时我们得先有个良好的组织体系。从前面下载的工具和相关的支持库之间就可以看出,有许多文件得好好加以组织。幸运的是,Maven Ant Tasks 可以帮我们下载和管理所有的外部依赖文件。

为何在意

如果你通过扩展本书的示例而做出了一些很酷的东西,想将它们转换成实用的应用程序,那么你的代码从一开始就得有良好的组织。更重要的是,如果你按照这里所说的方式组织,我们在示例中给你的命令和指令才会有意义,才能起实际作用。书中有很多示例也彼此相关,因此一开始走对路是很重要的。

如果你想跳过这一段去看后面的示例,或者不想输入一些很长的示例程序代码和配置文件,则可以从本书网站下载各章示例的“最终”版本。这些下载到的文件的组织方式的确如这里所述。我们强烈建议你下载示例代码,并将它们作为你阅读本书时的参考。

应该怎么做

以下介绍如何建立一个空的项目层次结构,如果你还没有下载“最终的”示例:

1.在硬盘目录中选择一个位置,作为演练这些示例的目录,然后创建一个新的目录,从现在开始,我们就称这个目录为你的项目目录。

2.进入该目录,创建名为 src 及 data 的子目录。Java 源代码和相关资源的层次结构会放在 src 目录中。我们的构建过程在编译代码时,会将结果放在编译时创建的 classes 目录下,然后把运行时需要的任何资源都复制到这个目录中。data 目录用于存放 HSQLDB 数据库相关的文件。

3.我们打算创建的示例类都将放在 com.oreilly.hh(harnessing Hibernate)包中,而将 Hibernate 生成的数据 bean 都放在 com.oreilly.hh.data 包中,以便将它们与我们手工创建的类分离开来,所以我们在 src 目录下创建这些目录。在 Linux 和 Mac OS X 上,可以使用以下命令来创建目录:

mkdir-p src/com/oreilly/hh/data

在项目目录中执行这个命令,一步就可以完成目录的创建。

这时,你的项目目录结构应该如图 1-5 所示。

注意:与本书第 1 版相比,这一版的目录结构要简单得多,似乎不值得一提!

图 1-5 最初的项目目录结构

快速测试

在我们真正使用 Hibernate 来做些有用的工作以前,还应该检查一下其他支持库是否存在和可以使用。我们先从整个项目都会用到的 Ant 配置文件开始,告诉 Ant 我们把要用的文件放在哪里,同时让 Ant 启动 HSQLDB 数据库图形界面。这可以证明 Maven Ant Tasks 能够找到并下载示例依赖的库,可以访问数据库图形界面,通过这个界面我们可以查看 Hibernate 为我们创建的真实数据。此时只是作为一个基本的完整性检查,以确认没有少什么东西,保证我们为继续学习做好准备。

打开你最喜欢的文本编辑器,在项目目录最顶层创建一个名为 build.xml 的文件。将例 1-1 的内容输入到这个文件中。

例 1-1:Ant 构建(build)文件

<?xml version="1.0"?>❶

<project name="Harnessing Hibernate 3(Developer's Notebook Second Edition)"

default="db"basedir="."

xmlns:artifact="antlib:org.apache.maven.artifact.ant">❷

<!--Set up properties containing important project directories-->❸

<property name="source.root"value="src"/>

<property name="class.root"value="classes"/>

<property name="data.dir"value="data"/>

<artifact:dependencies pathId="dependency.classpath">❹

<dependency groupId="hsqldb"artifactId="hsqldb"version="1.8.0.7"/>

<dependency groupId="org.hibernate"artifactId="hibernate"

version="3.2.5.ga">

<exclusion groupId="javax.transaction"artifactId="jta"/>

</dependency>

<dependency groupId="org.hibernate"artifactId="hibernate-tools"

version="3.2.0.beta9a"/>

<dependency groupId="org.apache.geronimo.specs"

artifactId="geronimo-jta_1.1_spec"version="1.1"/>

<dependency groupId="log4j"artifactId="log4j"version="1.2.14"/>

</artifact:dependencies>

<!--Set up the class path for compilation and execution-->

<path id="project.class.path">❺

<!--Include our own classes, of course-->

<pathelement location="${class.root}"/>❻

<!--Add the dependencies classpath-->

<path refid="dependency.classpath"/>❼

</path>

<target name="db"description="Runs HSQLDB database management UI

against the database file--use when application is not running">❽

<java classname="org.hsqldb.util.DatabaseManager"

fork="yes">

<classpath refid="project.class.path"/>

<arg value="-driver"/>

<arg value="org.hsqldb.jdbcDriver"/>

<arg value="-url"/>

<arg value="jdbc:hsqldb:${data.dir}/music"/>

<arg value="-user"/>

<arg value="sa"/>

</java>

</target>

</project>

输入时要小心那些标点符号,对于自结束的(self-closing)XML 标签更要小心(是“/>”,而不是“>”)。如果输入错误,代价就是运行 Ant 时得到解析错误的信息。如果你不想手工输入这些文件的内容,可以从本书网站下载这些文件。如果你正在阅读的是 PDF 电子文档,也可以剪切和粘贴代码,但需要去掉一些无关的排版字符。

如果你以前没有看过 Ant 构建文件,以下简单介绍可以帮助你熟悉它。(如果你想查看更多的细节,可以访问文档 http://ant.apache.org/manual/index.html。)

❶第 1 行只是声明这个文件的类型是 XML。如果你以前在其他情况下用过 XML,就应该很习惯这种文件格式;如果没有,那就再看一次(Ant 目前不需要这一行,但大多数 XML 解析器都需要,因此养成这种习惯是一件好事)。

❷Ant 的构建文件总包含一个 project 定义。default 属性用于告诉 Ant,如果在命令行没有指定要构建任何目标(target),Ant 要默认构建哪个目标(后面会定义)。basedir 属性用于指定所有路径计算都对应于哪个目录。我们可以不指定这个属性,因为在默认情况下总是将 build.xml 所在的目录作为相对目录的基本目录,但是明确指定类似的基本设置是一种好习惯。在这个 project 元素中需要注意的一个重要事情是,xmlns:artifact 是专门为 Maven Ant Tasks 提供的命名空间定义。该命名空间定义使用了 artifact 前缀,这样就可以在构建文件中使用 Maven Ant Tasks 了(后面有具体的使用方法)。

❸接下来的几行定义了 3 个属性,我们可以在构建文件的其他部分中,通过名称来引用相应的属性。基本上,我们在此是为项目中各个部分用到的重要目录定义其符号名称。这样做并非必要(尤其是目录名称非常简单时),不过这也是一种好习惯。至少,如果你得修改这些目录中的某个目录时,只需要修改构建文件中的一个地方,而不用进行繁琐的搜索和替换操作。

❹artifact:dependencies 元素来源于 Maven Ant Tasks,你(以及 Ant)可以通过 artifact:前缀判断出这一点。在这个元素中,我们定义了一套依赖,项目需要它们才可以编译和执行。这些依赖对应于 Maven 2 Repository(位于 http://repol.maven.org/maven2)中央仓库中的 JAR 文件(或其他生成文件)。每个 artifact(工件)由一个 groupId、artifactId 以及 version 号进行惟一标识。在这个项目中,我们需要依靠 Hibernate、HSQLDB、Log4J 以及 JTA API。当 Maven Ant Tasks 遇到这些依赖声明时,就会从 Maven 2 中央仓库中按照需要将每个 artifact 下载到你的本地 Maven 2 仓库中(在~/.m2/repository 目录下)。如果你对这一区段的配置内容还没有什么感觉,大可不必担心,在稍后几页的内容中,我们将深入探索相关的细节。如果需要,你可以对这一区段的配置作出修改(只要修改 version 值),以便使用这些依赖的程序包的更新版本(因为在本书交付印刷之后,可能会有新版本推出)。不过你可以放心,本书印刷出版后,书中的例子将一定能够正常运行,因为不论你什么时候研究这些例子,Maven 仓库可以确保我们测试过的版本总是可用的。我们之所以在本书中采用 Maven Ant Tasks,这也是很大的一部分原因。

❺class-path 区段的用途很明确。这个功能正是我每次做 Java 项目时,几乎总要为其配置一个简单的 Ant 构建文件的原因。无论做什么规模的项目,总是需要将很多第三方程序库放到类路径中,而且还得确保编译时和运行时的配置都完全一样。Ant 使得这一工作变得很简单。我们定义了一个 path,有点像一个属性,但是它知道应该如何解析、收集文件和目录信息。我们的类路径包含 classes 目录,经过编译的 Java 文件就放在这个目录中(这个目录现在还不存在;下一章会在构建处理中多增加一个步骤以创建它),此外,也包含与 artifact:dependencies 元素中列出的依赖相对应的所有 JAR 文件。这正是编译和运行项目所需要的一切。

对于 Java 路径和类层次结构的理解和处理来说,Ant 是一个很棒的工具,值得我们深入学习。

❻这一行的标点符号有点令人迷惑,但实际上可以划分成具有意义的几个部分。Ant 可以使用置换(substitution)机制,将变量值插入到规则中。当你看到像"${class.root}"这样的语句时,这表示“寻找名为 class.root 的属性值,用这个值来置换这里的字符串”。所以,根据前面对 class.root 的定义,置换的结果就好像是在这里输入了:<pathelement location="classes"/>。那么,为什么要这么做呢?这是为了可以在整个构建文件中共享某个属性值,这样,如果需要修改相关的配置,则只需要关注一个地方就可以了。在大型的复杂项目中,这种组织和管理是很重要的。

❼我们在前面看到的 artifact:dependencies 元素使用它的 pathId 属性,将所有声明的依赖组装到一个名为 dependency.classpath 的路径中。这里,我们将 dependency.classpath 的内容附加到 project.class.path 中,以便在编译和运行时可以找到我们用 Maven 取回的依赖包。

❽最后,这些前期工作做好以后,我们就能够定义第一个构建目标了。一个目标其实就是一系列任务,为了完成项目的目标,必须按顺序执行任务。典型的构建目标就是做些类似于编译代码、运行测试、为发布而打包文件等各种事情。可以从 Ant 内建的一组丰富的功能中选择任务,而像 Hibernate 这样的第三方工具则可以扩展 Ant,以便提供它们自己的任务,这在下一章就会看到。我们的第一个构建目标是 db,它会运行 HSQLDB 的图形界面,让我们查看示例数据库。我们可以用 Ant 内建的 java 任务来完成这项工作,它会为我们运行 Java 虚拟机,并配置好我们需要的启动类、参数(argument)以及属性。

就此例而言,我们想要调用的类是 org.hsqldb.util.DatabaseManager,在 HSQLDB JAR 中可以找到这个类(Maven Ant Tasks 将为我们管理这个依赖)。将 fork 属性设置为"yes",这是告诉 Ant 使用另一个单独的虚拟机,而不是默认的虚拟机,因为默认虚拟机得花费比较长的时间,而且通常没有这个必要。在这个例子中,这一点很重要,因为我们想让数据库管理器 GUI 一直保持运行,直到我们关掉它,但是,如果在 Ant 自己的 VM 中运行,就达不到这样的效果。

如果你的数据库 GUI 弹出后,就马上消失,请再次检查你的 java 任务的 fork 属性。

你可以看到我们先是如何告诉 java 任务,有关之前已经配置好的类路径信息的(这是我们所有的构建目标都得使用的配置属性)。然后,我们为数据库管理器提供了很多参数,告诉它使用标准的 HSQLDB JDBC 驱动程序,到哪儿去找数据库,以及使用的用户名是什么。我们在 data 目录中指定了一个名为 music 的数据库。这个目录当前还是空的,所以 HSQLDB 会在我们第一次使用时创建这个数据库。新数据库默认的“系统管理员”用户名是 sa,最初的配置是一开始不需要密码。显然,如果你计划让数据库在网络上也可以使用(HSQLDB 能够做得到),就需要设置密码。我们不需要做这些花哨的事,所以现在先不用理会其他配置。

OK,让我们试一下吧!保存好这个文件,在你的顶级项目目录(build.xml 所在的目录)的命令提示行中输入以下命令:

ant db

(或者,因为我们将 db 设置为默认的构建目标,你也可以只输入 ant)在 Ant 开始运行以后,如果一切顺利,你会看到像下面这样的输出结果:

Buildfile:build.xml

Downloading:hsqldb/hsqldb/1.8.0.7/hsqldb-1.8.0.7.pom

Transferring 0K

Downloading:org/hibernate/hibernate/3.2.5.ga/hibernate-3.2.5.ga.pom

Transferring 3K

Downloading:net/sf/ehcache/ehcache/1.2.3/ehcache-1.2.3.pom

Transferring 19K

Downloading:commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.pom

Transferring 5K

Downloading:commons-collections/commons-collections/2.1/commons-collections-

2.1.pom

Transferring 3K

Downloading:asm/asm-attrs/1.5.3/asm-attrs-1.5.3.pom

Transferring 0K

Downloading:dom4j/dom4j/1.6.1/dom4j-1.6.1.pom

Transferring 6K

Downloading:antlr/antlr/2.7.6/antlr-2.7.6.pom

Transferring 0K

Downloading:cglib/cglib/2.1_3/cglib-2.1_3.pom

Transferring 0K

Downloading:asm/asm/1.5.3/asm-1.5.3.pom

Transferring 0K

Downloading:commons-collections/commons-collections/2.1.1/commons-collections-

2.1.1.pom

Transferring 0K

Downloading:org/hibernate/hibernate-tools/3.2.0.beta9a/hibernate-tools-

3.2.0.beta9a.pom

Transferring 1K

Downloading:org/hibernate/hibernate/3.2.0.cr5/hibernate-3.2.0.cr5.pom

Transferring 3K

Downloading:freemarker/freemarker/2.3.4/freemarker-2.3.4.pom

Transferring 0K

Downloading:org/hibernate/jtidy/r8-20060801/jtidy-r8-20060801.pom

Transferring 0K

Downloading:org/apache/geronimo/specs/geronimo-jta_1.1_spec/1.1/geronimo-

jta_1.1_spec-1.1.pom

Transferring 1K

Downloading:org/apache/geronimo/specs/specs/1.2/specs-1.2.pom

Transferring 2K

Downloading:org/apache/geronimo/genesis/config/project-config/1.1/project-

config-1.1.pom

Transferring 14K

Downloading:org/apache/geronimo/genesis/config/config/1.1/config-1.1.pom

Downloading:org/apache/geronimo/genesis/config/config/1.1/config-1.1.pom

Downloading:org/apache/geronimo/genesis/config/config/1.1/config-1.1.pom

Transferring 0K

Downloading:org/apache/geronimo/genesis/genesis/1.1/genesis-1.1.pom

Downloading:org/apache/geronimo/genesis/genesis/1.1/genesis-1.1.pom

Downloading:org/apache/geronimo/genesis/genesis/1.1/genesis-1.1.pom

Transferring 6K

Downloading:org/apache/apache/3/apache-3.pom

Downloading:org/apache/apache/3/apache-3.pom

Downloading:org/apache/apache/3/apache-3.pom

Transferring 3K

Downloading:log4j/log4j/1.2.14/log4j-1.2.14.pom

Transferring 2K

Downloading:org/hibernate/hibernate-tools/3.2.0.beta9a/hibernate-tools-

3.2.0.beta9a.jar

Transferring 352K

Downloading:org/hibernate/jtidy/r8-20060801/jtidy-r8-20060801.jar

Transferring 243K

Downloading:commons-collections/commons-collections/2.1.1/commons-collections-

2.1.1.jar

Transferring 171K

Downloading:commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar

Transferring 37K

Downloading:antlr/antlr/2.7.6/antlr-2.7.6.jar

Transferring 433K

Downloading:org/apache/geronimo/specs/geronimo-jta_1.1_spec/1.1/geronimo-

jta_1.1_spec-1.1.jar

Transferring 15K

Downloading:net/sf/ehcache/ehcache/1.2.3/ehcache-1.2.3.jar

Transferring 203K

Downloading:asm/asm/1.5.3/asm-1.5.3.jar

Transferring 25K

Downloading:freemarker/freemarker/2.3.4/freemarker-2.3.4.jar

Transferring 770K

Downloading:dom4j/dom4j/1.6.1/dom4j-1.6.1.jar

Transferring 306K

Downloading:asm/asm-attrs/1.5.3/asm-attrs-1.5.3.jar

Transferring 16K

Downloading:cglib/cglib/2.1_3/cglib-2.1_3.jar

Transferring 275K

Downloading:hsqldb/hsqldb/1.8.0.7/hsqldb-1.8.0.7.jar

Transferring 628K

Downloading:log4j/log4j/1.2.14/log4j-1.2.14.jar

Transferring 358K

Downloading:org/hibernate/hibernate/3.2.5.ga/hibernate-3.2.5.ga.jar

Transferring 2202K

db:

一大堆下载文件信息表明 Maven Ant Tasks 完成了它的任务,为我们下载了指定的文件(包括 HSQLDB 和 Hibernate)以及所有依赖的库文件。这一过程可能需要花费一段时间才能完成(取决于网络连接的速度和服务器的情况),但是它只进行一次。下一次再运行 Ant 时,Maven Ant Tasks 就会注意到你的本地库中已经包含了所有这些文件,就会默认继续执行其他需要完成的任务了。

在所有下载完成以后,Ant 会打印输出"db:",表明它正开始执行你请求的目标。一会儿,你应该会看到 HSQLDB 的图形界面,如图 1-6 所示。我们的数据库现在还没有什么东西,所以,除了命令能运行以外,没有其他内容。窗口左上部的树形视图是数据库中可以浏览的各种数据表和字段。就目前而言,只要确认最上层是否为"jdbc:hsqldb:data/music"就可以了。

图 1-6 HSQLDB 数据库管理器界面

如果你喜欢,可以浏览一下菜单,但不要对数据库进行任何修改。在完成以后,选择"File"→"Exit",窗口就会关闭,同时 Ant 将报告以下信息:

BUILD SUCCESSFUL

Total time:56 seconds

"Total time"是你运行这个数据库管理器程序所用的时间,所以其值是变化的(刚才我们在 Ant 的构建文件中为 java 任务设置了 fork 属性,所以直到关闭数据库以前,Ant 会一直等待)。此时,如果你查看 data 目录,你会发现 HSQLDB 已经创建了一些文件来保存数据库信息:

%ls data

music.log music.properties music.script

你甚至可以查看这些文件的内容。和大多数数据库系统不同,HSQLDB 是以人类可读的格式来存储数据的。.properties 文件中包含一些基本设置,而.script 文件中的数据则以 SQL 语句的形式保存。.log 文件用于当应用程序崩溃或没有正常关闭数据库而强行退出时,可以重新构建一致的数据库状态。现在,你在这些文件中看到的都是基本定义,都是默认值;以后我们开始创建数据表并添加数据时,就可以看到这些文件会有所变化。这也可以作为一种有用的调试手段来进行基本的完整性检查,甚至比启动图形界面执行查询还要快。

注意:能够直接读取 HSQLDB 数据库文件的内容,是一件诡异但有趣的事。

发生了什么事

目前我们已经成功运行了第一个示例,建立了我们的项目构建文件,现在解释 Ant 如何取回这个项目必需的依赖文件。我们再查看一下示例的 build.xml 文件中的 artifact:dependencies 元素(如例 1-2 所示)。

例 1-2:artifact:dependencies 元素

<artifact:dependencies pathId="dependency.classpath">

<dependency groupId="hsqldb"artifactId="hsqldb"version="1.8.0.7"/>

<dependency groupId="org.hibernate"artifactId="hibernate"

version="3.2.5.ga">

<exclusion groupId="javax.transaction"artifactId="jta"/>

</dependency>

<dependency groupId="org.hibernate"artifactId="hibernate-tools"

version="3.2.0.beta9a"/>

<dependency groupId="org.apache.geronimo.specs"

artifactId="geronimo-jta_1.1_spec"version="1.1"/>

<dependency groupId="log4j"artifactId="log4j"version="1.2.14"/>

</artifact:dependencies>

如果你以前从没有用过 Maven,这个例子看起来非常令人费解。我们先定义一些术语。首先是 artifact。一个 artifact 就是项目生成的一个文件,它可以是任意类型的文件—Web 应用程序的 WAR 文件、企业应用程序的 EAR 文件或是简单的 JAR 文件。对于我们的用途来说,我们使用的是 JAR artifact,如果你不在 dependency 元素中指定它,其默认的类型就是 jar,非常方便。

artifact 有 4 个属性:groupId、artifactId、version 以及 type。例如,我们需要 org.hibernate 组内的 hibernate artifact,其版本是 3.2.5.ga,文件类型是 jar。Maven 将使用这些标识符在位于 http://repo1.maven.org/maven2/的中央 Maven 2 库中来查找定位适当的依赖文件。使用这些值,Maven 将通过以下模式来尝试定位 Hibernate 的 JAR:<repositoryUrl>/<groupId>/<artifactId>/<version>/<artifactId>-<version>.<type>,其中,groupId 中的点号“.”将转换成 URL 的路径分隔符。使用这样的模式,就可以定位 Hibernate 和 HSQLDB 依赖的 JAR 文件了,如例 1-3 所示。

例 1-3:项目依赖文件的 URL

http://repo1.maven.org/org/hibernate/hibernate/3.2.5.ga/hibernate-3.2.5.ga.jar

http://repo1.maven.org/hsqldb/hsqldb/1.8.0.7/hsqldb-1.8.0.7.jar

在 build.xml 文件中,我们没有在 Hibernate 依赖声明中包含 JTA 依赖。这是因为 Hibernate 库使用的是一个非自由(nonfree)的 JAR 文件,所以 Maven 2 公共库中没有这个文件。这个项目没有使用 Sun 提供的标准 JTA API JAR,而是使用了 Apache Geronimo 项目创建的 JTA API。geronimo-jta_1.1_spec 是 Java Transaction API.的一个自由的开源实现版本。这个替换是通过在 Hibernate 3.2.5.ga 的依赖声明中使用 exclusion 元素来实现的,并随后明确声明了需要使用 Geronimo JTA spec 1.1。

好了,我们已经介绍了 Maven Ant Tasks 如何从 Maven 库中取回依赖文件,但是,如果已经下载好了这些依赖文件,又会怎么样呢?Maven Ant Tasks 将所有的依赖文件都下载到一个本地的 Maven 库中,由 Maven 负责维护这个本地库,使其结构与远程 Maven 库的结构保持一致。当需要检查某个 artifact 时,Maven 先检查本地库,如果本地库没有这个 artifact 时,再从远程库中请求该 artifact。这意味着,如果同时有 20 个项目都引用了同一版本的 Hibernate,从 Maven 远程库中只下载一次 Hibernate 的依赖 artifact,所有 20 个项目都会引用保存在本地 Maven 库中的同一个副本。那么,这个不可思议的本地 Maven 库是放在哪里呢?最简单的回答就是,在 build.xml 文件中添加一个目标。在原来的 Ant build.xml 的末尾添加以下目标,如例 1-4 所示。

例 1-4:打印输出依赖类的路径

<target name="print-classpath"description="Show the dependency class path">

<property name="class.path"refid="dependency.classpath"/>

<echo>${class.path}</echo>

</target>

运行这个目标,将生成以下输出结果:

%ant print-classpath

Buildfile:build.xml

print-classpath:

[echo]~\.m2\repository\commons-logging\commons-logging\1.0.4\

commons-logging-1.0.4.jar;\

~\.m2\repository\dom4j\dom4j\1.6.1\dom4j-1.6.1.jar;\

~\.m2\repository\cglib\cglib\2.1_3\cglib-2.1_3.jar;\……

运行该目标,输出结果会随你正在使用的操作系统的不同而有所变化,不过,你可以看到,依赖类的路径都引用了本地 Maven 库。在运行 Windows XP 的计算机上,这一路径可能位于 C:\Documents and Settings\Username\.m2\repository;在运行 Windows Vista 的计算机上,这一路径则可能位于 C:\Users\Username\.m2\repository;而在 Unix 和 Macintosh 上,该路径将会是~/.m2/repository 目录。

你也可能会注意到,在类路径中列出的依赖文件的数目要比我们在 build.xml 的 artifact:dependency 元素中声明的多。这些额外的依赖就是所谓的可传递的依赖(transitive dependency),它们是你明确声明的依赖文件所需要的依赖。例如,Hibernate 需要依赖 CGLib、EHCache、Commons Collections 以及其他程序库。对 Maven 的详细介绍超出了本书讨论的范围,我在这里只对 Maven Ant Tasks 如何为你的项目构造整套依赖结构提供一些提示。如果在构建好一个示例后,你查看一下本地 Maven 库,你会注意到在每个 JAR artifact 旁边会有一个扩展名为.pom 的项目对象模型(POM)文件。POM 是 Maven 构建系统和仓库的基础,每一个 POM 描述了一个 artifact 和它的依赖。Maven Ant Tasks 使用这种元数据(metadata)来构造一个描述依赖传递关系的树状结构。换句话说,Maven Ant Tasks 并不只是负责下载 Hibernate,它们还负责下载 Hibernate 依赖的所有文件。

你实际需要知道的是它的工作原理就是这样的。

接下来做什么

感谢 Maven Ant Tasks,有了它,就不用像本书的最初版本那样亲自查找、下载、解压软件,并组织好它们。现在你可以从一个更高的起点来开始使用 Hibernate,在下一章中你可以看到,我们的进展会非常快速。你将看到 Hibernate 已经为你写好了 Java 代码!数据库模式(database schema)也好像是从天而降一样(或者,至少是来自于产生 Java 程序代码的同一个 XML 映射表)!真正的数据表和数据也会出现在 HSQLDB 管理器界面中(或者,至少是示范数据)!

听起来令人兴奋吧?嗯,和你以前的开发方法相比如何?我们继续研究下去,把 Hibernate 的强大功能唤醒吧。

为何无法工作

如果你没有看到数据库管理器窗口,而是出现了错误信息,那么应该尝试弄清楚是否是文件构建出了问题;是否是安装设置 Ant 或项目层次结构出错;是否是因为访问 Internet 困难,而不能从 Maven 库下载到依赖文件;或是其他什么原因。再次确认所有东西都安排妥当,并且按照前面介绍的方式正确地安装。如果是自己输入的文件有问题,可以考虑下载示例程序。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。