Maven项目多模块拆分

1.  多模块拆分的必要性

使用Java技术开发的工程项目,无论是数据处理系统还是Web网站,随着项目的不断发展,需求的不断细化与添加,工程项目中的代码越来越多,包结构也越来越复杂这时候工程的进展就会遇到各种问题:

(1)不同方面的代码之间相互耦合,这时候一系统出现问题很难定位到问题的出现原因,即使定位到问题也很难修正问题,可能在修正问题的时候引入更多的问题。

(2)多方面的代码集中在一个整体结构中,新入的开发者很难对整体项目有直观的感受,增加了新手介入开发的成本,需要有一个熟悉整个项目的开发者维护整个项目的结构(通常在项目较大且开发时间较长时这是很难做到的)。

(3)开发者对自己或者他人负责的代码边界很模糊,这是复杂项目中最容易遇到的,导致的结果就是开发者很容易修改了他人负责的代码且代码负责人还不知道,责任追踪很麻烦。

        将一个复杂项目拆分成多个模块是解决上述问题的一个重要方法,多模块的划分可以降低代码之间的耦合性(从类级别的耦合提升到jar包级别的耦合),每个模块都可以是自解释的(通过模块名或者模块文档),模块还规范了代码边界的划分,开发者很容易通过模块确定自己所负责的内容。


2. 使用maven构建模型进行多模块拆分

maven的多模块划分还是比较直观的,每个模块都是一个独立的maven项目,模块之间的相互引用和maven中对jar包依赖的解决是一致的,这使得物理(jar)和逻辑(dependency)上得以保持一致。我们先来看一个完整的多模块项目的组成(使用Maven The Definitive Guide上的例子):

(1)首先是整体的模块关系

引用书上对这些模块的介绍:

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能理解并返回simplemodel定义的模型对象。simple-persist有一个对simple-model的依 赖,它也依赖于模型对象上的Hibernate标注。

simple-webapp

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

simple-command

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

2)simple-parent项目

simple-parent是所有子模块的父类或者祖先模块,基本上父模块会被用来做为一个“抽象”模块,它不含有实际的可运行或被引用的逻辑代码,parent的pom文件中会声明一些公有的依赖还用一些构建配置例如使用的jdk版本,构建过程中的资源处理,通常在parent的pom中会声明子模块的引用,被引用的子模块在构建parent项目时也会被引用构建,子模块被构建的顺序和其在pom中的声明顺序关系不大,主要由子模块之间的依赖关系决定。maven使用一个被称为reactor(反应堆)的概念来描述这个子模块的构建顺序和依赖处理,记住循环依赖和相互引用在maven解析pom时就会被发现,这与其在parent的pom中声明的顺序是无关的。parent的pom结构如下:



  4.0.0
  
  	org.sonatype.mavenbook.multispring
  	parent
  	0.8-SNAPSHOT
  
  

你可能感兴趣的:(maven)