一、概念简介
1、什么是模块聚合?
当一个项目慢慢变大时,就需要对项目的功能进行拆分,分成独立的几个模块,这个时候就需要用到模块的聚合功能,将独立的几个模块聚合到一个项目中。聚合的主要作用是将解耦的模块进行工业化组装,形成分布式系统应用。
在父模块中声明该项目的所有模块,如下:
<packaging>pom</packaging><!-- 打包类型为pom --> <modules> <module>demo-common</module><!-- 公共组件 --> <module>demo-cms</module><!-- 后台管理系统 --> <module>demo-sso</module><!-- 单点登录系统 --> <!-- ...... --><!-- 其他模块 --> </modules>
在子模块中声明该模块所属的父项目,如下:
<packaging>jar</packaging><!-- 打包方式jar包或者war包,如果不声明默认为jar包,当然也可以为pom,这意味着此模块下面还有子模块 --> <parent> <groupId>com.mengfei</groupId><!-- 命名规范:com后面公司名或缩写 --> <artifactId>demo-parent</artifactId><!-- 命名规范:项目名-模块名 --> <version>0.0.1-SNAPSHOT</version> </parent>
2、什么是模块继承?
当系统越来越大,模块越来越多时,配置文件也越来越多,分布在各个模块的配置文件内容如果要修改时就很麻烦,不利于维护,这个时候就需要用到模块的继承功能,统一在父模块中进行通用配置,然后在子模块中继承父模块的配置。继承的主要作用就是方便维护配置文件,同时实现代码重用。在父项目中统一定义依赖的jar包,如下:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>4.12</junit.version><!-- 在属性设置中统一定义依赖jar包版本号 --> </properties> <dependencyManagement><!-- 在此标签管理下的依赖配置可以由子模块继承 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> </dependencies> </dependencyManagement>在子模块中继承父模块的配置,如下:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <!-- 继承依赖配置时就不需要再添加版本号,实现父项目的统一管理 --> </dependencies>
3、什么是依赖传递?
当我们项目中的某个模块需要用到另外一个模块时,我们称之为该模块依赖另一个模块,比如dao层访问数据库时需要用到model层,那就是dao层依赖model层。然后如果service层同时需要用到dao层和model层时,service层只需要依赖dao层即可,因为dao层已经依赖了model层,依赖从dao层传递到了service层,所以service层也依赖了model层,这就是依赖传递的特性。如下图:
二、项目演示
1、创建父模块
① 选择maven项目原型(File → New → Project → Next)
② 填写父模块信息
③ 查看创建的项目
不知道怎么创建逻辑工作空间的可以参考: Eclipse使用(一)—— 下载、安装Eclipse并进行编码配置和一些常用的使用配置
2、创建子模块demo-common
① 开始创建子模块(左键点击父模块,右键点击选择New → Project)
② 填写父子模块名称
③ 选择maven项目原型
④ 项目创建完成
3、同样的步骤选择webapp原型创建子模块demo-sso
4、同样的步骤选择site-simple原型再创建一个子模块demo-cms
5、查看父项目的pom文件,聚合了三个模块
<modules> <module>demo-common</module> <module>demo-sso</module> <module>demo-cms</module> </modules>
6、向父项目的pom中添加依赖管理
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>4.12</junit.version> <servlet-api.version>4.0.0</servlet-api.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servlet-api.version}</version> </dependency> </dependencies> </dependencyManagement>
7、修改demo-sso中的pom文件内容,继承父项目的pom依赖
demo-sso因为缺少servlet容器应该一直报错,修改完之后更新一下demo-sso应该就不会报错了,不报错了说明继承依赖成功。
<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> </dependencies>
8、修改demo-common中的pom文件内容,继承父项目的pom依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <!-- <scope>test</scope> --> </dependency> </dependencies>
9、在demo-common项目的App类中编写一个测试方式,调用Test注解
测试方法成功执行,说明继承依赖成功
10、按照上面的步骤在demo-cms下面创建五个子模块
cms-model:cms系统用到的实体模型模块
cms-dao:cms系统的数据访问模块
cms-service:cms系统的业务服务模块
cms-controller:cms系统的控制转发模块
cms-web:cms系统的静态资源和视图模块
下面是它们的依赖关系图:
11、进行依赖传递测试
① 修改cms-dao的pom文件如下内容(添加junit依赖,仅仅为了测试,开发中不会这么做)
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <!-- <scope>test</scope> --> </dependency> </dependencies>
② 修改cms-service的pom文件如下内容(添加cms-dao的依赖)
<dependencies> <dependency> <groupId>com.mengfei</groupId> <artifactId>cms-dao</artifactId> <version>${project.version}</version> </dependency> </dependencies>
③ 修改cms-controller的pom文件如下内容(添加cms-service的依赖)
<dependencies> <dependency> <groupId>com.mengfei</groupId> <artifactId>cms-service</artifactId> <version>${project.version}</version> </dependency> </dependencies>