本章,我们创建一个多模块项目,它从Chapter 6, 一个多模块项目和Chapter 5, 一个简单的Web应用的样例演化成一个使用了Spring Framework和Hibernate创建的,从Yahoo!
Weather信息源读取数据,包含一个简单web应用和一个命令行工具的项目。???中开发的simple-weather
代码将会和Chapter 5, 一个简单的Web应用中开发的simple-weather
项目结合。在创建这个多模块项目的过程中,我们将会探索Maven并且讨论用不同方式来创建模块化项目以鼓励重用。
该样例中开发的多模块项目包含了???和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/
目录。
展示一个巨大企业级项目的复杂度远远超出了本书的范围。这样的项目的特征有,多数据库,与外部系统的集成,子项目通过部门来划分。这些项目通常跨越了数千行代码,牵涉了数十或数百软件开发者的努力。虽然这样的完整样例超出了本书的范围,我们仍然可以为你提供一个能让你想起大型企业应用的样例项目。在小结中我们提议了一些在本章描述之外的模块化可能性。
本章,我们将会看一个多模块Maven项目,它将产生两个应用程序:一个对于Yahoo! Weather信息源的命令行查询工具,以及查询同样信息源的一个web应用。两个应用都会将查询结果存储到一个内嵌数据库中。都允许用户从内嵌数据库中获取历史天气数据。都会重用应用程序逻辑,并且共享一个持久化类库。本章样例基于在???中介绍的Yahoo! Weather解析代码构建。该项目被划分成如Figure 7.1, “多模块企业级应用的模块关系”所示的五个子项目。
在Figure 7.1, “多模块企业级应用的模块关系”中,你能看到simple-parent有五个子模块,它们分别是:
- simple-model
-
该模块定义了一个简单的对象模型,对从Yashoo! Weather信息源返回的数据建模。该对象模型包含了
Weather
,Condition
,Atmosphere
,Location
,和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-command
和simple-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
中定义的DAO。simple-webapp
有对于simple-weather
和simple-persist
的直接依赖;还有一个对于simple-model
的传递性依赖。 - simple-command
-
该模块包含了一个用来查询Yahoo! Weather信息源的简单命令行工具。它包含了一个带有静态
main()
方法的类,与simple-weather
中定义的WeatherService
和simple-persist
中定义的DAO交互。simple-command
有对于simple-weather
和simple-persist
的直接依赖;还有一个对于simple-model
的传递性依赖。
本章设计的项目一方面够简单,以能在一本书中介绍,又够复杂,能提供一组五个子模块。该样例有一个带有五个类的模型项目,带有两个服务类的持久化类库,带有五六个类的天气解析类库,但是一个现实系统可能有一个带有数百对象的模型项目,很多持久化类库,以及跨越多个部门的服务类库。虽然我们试图确保本例中的代码尽可能的直接以能在短时间内理解,但我们也不怕麻烦的以模块化的方式构建了这个项目。你可能会要看一下本章的样例,然后会认为Maven为我们这个只有五个类的模型项目带来了太多的复杂度。虽然使用Maven确实建议一定程度的模块化,但这里我们不怕麻烦的将样例项目弄得复杂,目的是展示Maven的多模块特性。
本章样例中涉及了一些十分流行,但与Maven没有直接关系的而技术。这些技术是Spring Framework和Hibernate。Spring Framework是一个反转控制(IoC)容器,以及一组目的在于简化与各种J2EE类库交互的框架。使用Spring Framework作为应用程序开发的基础框架能让你访问很多有用的抽象接口,它们能简化与持久化框架如Hibernate或者iBatis的交互,以及企业API如JDBC,JNDI,和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/。