Chapter 7. 多模块企业级项目

7.1. 简介

本章,我们创建一个多模块项目,它Chapter 6, 一个多模块项目Chapter 5, 一个简单的Web应用的样例演化成一个使用了Spring Framework和Hibernate创建的,从Yahoo! Weather信息源读取数据,包含一个简单web应用和一个命令行工具的项目。???中开发的simple-weather代码将会和Chapter 5, 一个简单的Web应用中开发的simple-weather项目结合。在创建这个多模块项目的过程中,我们将会探索Maven并且讨论用不同方式来创建模块化项目以鼓励重用。

7.1.1. 下载本章样例

该样例中开发的多模块项目包含了???Chapter 5, 一个简单的Web应用中项目的修改的版本,我们不会再使用Maven Archetype插件来生成这个多模块项目。我们强烈建议当你在阅读本章内容的时候,下载样例代码作为一个补充参考。本章的样例项目包含在本书的样例代码中,你可以从两个地方下载,http://www.sonatype.com/book/mvn-examples-1.0.zip或者http://www.sonatype.com/book/mvn-examples-1.0.tar.gz。解开存档文件至任意目录,然后到ch07/目录。在ch07/目录你会看到一个名为simple-parent/的目录,它包含了本章开发出来的多模块Maven项目。在这个simple-parent/项目目录中,你会看到一个pom.xml,以及五个子模块目录simple-model/simple-persist/simple-command/simple-weather/simple-webapp/。如果你想要在浏览器里看样例代码,访问http://www.sonatype.com/book/examples-1.0,然后点击ch07/目录。

7.1.2. 多模块企业级项目

展示一个巨大企业级项目的复杂度远远超出了本书的范围。这样的项目的特征有,多数据库,与外部系统的集成,子项目通过部门来划分。这些项目通常跨越了数千行代码,牵涉了数十或数百软件开发者的努力。虽然这样的完整样例超出了本书的范围,我们仍然可以为你提供一个能让你想起大型企业应用的样例项目。在小结中我们提议了一些在本章描述之外的模块化可能性。

本章,我们将会看一个多模块Maven项目,它将产生两个应用程序:一个对于Yahoo! Weather信息源的命令行查询工具,以及查询同样信息源的一个web应用。两个应用都会将查询结果存储到一个内嵌数据库中。都允许用户从内嵌数据库中获取历史天气数据。都会重用应用程序逻辑,并且共享一个持久化类库。本章样例基于在???中介绍的Yahoo! Weather解析代码构建。该项目被划分成如Figure 7.1, “多模块企业级应用的模块关系”所示的五个子项目。

多模块企业级应用的模块关系

Figure 7.1. 多模块企业级应用的模块关系


Figure 7.1, “多模块企业级应用的模块关系”中,你能看到simple-parent有五个子模块,它们分别是:

simple-model

该模块定义了一个简单的对象模型,对从Yashoo! Weather信息源返回的数据建模。该对象模型包含了WeatherConditionAtmosphereLocation,和Wind对象。当我们的应用程序解析Yahoo! Weather信息源的时候,simple-weather中定义的解析器会解析XML并创建供应用程序使用的Weather对象。该项目还包含了使用Hibernate 3标注符标注的模型对象,它们在simple-persist的逻辑中被用来映射每个模型对象至关系数据库中对应的表。

simple-weather

该模块包含了所有用来从Yahoo! Weather数据源获取数据并解析结果XML的逻辑。从数据源返回的XML被转换成simple-model中定义的模型对象。simple-weather有一个对simple-model的依赖。simple-weather定义了一个WeatherService对象,该对象会被simple-commandsimple-webapp项目引用。

simple-persist

该模块包含了一些数据访问对象(DAO),这些对象将Weather对象存储在一个内嵌数据库中。这个多模块项目中的两个应用都会使用simple-persist中定义的DAO来将数据存储至内嵌数据库中。本项目中定义的DAO能理解并返回simple-model定义的模型对象。simple-persist有一个对simple-model的依赖,它也依赖于模型对象上的Hibernate标注。

simple-webapp

这个web应用项目包含了两个Spring MVC控制器实现,控制器使用了simple-weather中定义的WeatherService,以及simple-persist中定义的DAOsimple-webapp有对于simple-weathersimple-persist的直接依赖;还有一个对于simple-model的传递性依赖。

simple-command

该模块包含了一个用来查询Yahoo! Weather信息源的简单命令行工具。它包含了一个带有静态main()方法的类,与simple-weather中定义的WeatherServicesimple-persist中定义的DAO交互。simple-command有对于simple-weathersimple-persist的直接依赖;还有一个对于simple-model的传递性依赖。

本章设计的项目一方面够简单,以能在一本书中介绍,又够复杂,能提供一组五个子模块。该样例有一个带有五个类的模型项目,带有两个服务类的持久化类库,带有五六个类的天气解析类库,但是一个现实系统可能有一个带有数百对象的模型项目,很多持久化类库,以及跨越多个部门的服务类库。虽然我们试图确保本例中的代码尽可能的直接以能在短时间内理解,但我们也不怕麻烦的以模块化的方式构建了这个项目。你可能会要看一下本章的样例,然后会认为Maven为我们这个只有五个类的模型项目带来了太多的复杂度。虽然使用Maven确实建议一定程度的模块化,但这里我们不怕麻烦的将样例项目弄得复杂,目的是展示Maven的多模块特性。

7.1.3. 本例中所用的技术

本章样例中涉及了一些十分流行,但与Maven没有直接关系的而技术。这些技术是Spring Framework和Hibernate。Spring Framework是一个反转控制(IoC)容器,以及一组目的在于简化与各种J2EE类库交互的框架。使用Spring Framework作为应用程序开发的基础框架能让你访问很多有用的抽象接口,它们能简化与持久化框架如Hibernate或者iBatis的交互,以及企业APIJDBCJNDI,和JMS。Spring Framework在过去一些年变得十分流行,作为对来自Sun微系统的重量级企业标准的替代。Hibernate是一个被广泛使用的对象-关系映射框架,能让你与关系数据库的交互就像它们是Java对象的集合一样。本例关注构建一个简单的web应用和一个命令行应用,它们使用Spring Framework为应用暴露了一组可重用的组件,使用Hibernate将天气数据持久化至内嵌数据库。

我们决定包含对这些框架的参考以展示在使用Maven的时候如何使用这些技术构建项目。虽然本章中我们会大概介绍这些技术,但不是完整的解释这些技术。要了解更多关于Spring Framework的信息,请查看该项目的web站点:http://www.springframework.org/。要了解更多关于Hibernate和Hibernate标注的信息,请查看该项目的web站点:http://www.hibernate.org。本章使用了HSQLDB作为一个内嵌数据库;要了解更多的关于该数据库的信息,访问该项目的web站点:http://hsqldb.org/