Maven的多模块管理
在实际开发的项目中,一个完整的项目由一个一个的模块(model)组成,今后的实际开发,你也仅仅是负责其中一个模块的一个小环节;同样在MVC架构中(MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)),单一的一个Maven模块已经不能满足我们的需求,我们需要有一个父模块开管理我们的其它子模块。。。Maven 自动化工具(一)
关于Maven的多模块创建模式可以大体分成三种
- 包含关系——父工程包含子模块
- 平行关系——父工程与子模块平行
接下来我用IDEA演示一下这三种方式的构建
-
创建一个A模块作为父工程
这里选择java或javaweb都可以,因为我们仅仅把它作为父工程,只保留
Next,Finish然后等待Maven构建即可 -
Maven构建好后,在pom文件中删除其它多余内容,保留坐标即可
作为父工程的必须删除src目录
package标签的文内容必须设置为pom
包含关系
创建子模块
Next,Finish然后等待Maven构建即可(C模块同理)
至此,A工程诞生了B、C两个子模块
平行关系
创建子模块
Next,Finish然后等待Maven构建即可(C模块同理)
至此,A工程诞生了D、E两个子模块
父子关系即可满足项目需求,实际可以子、父、爷、祖…无限套娃
Maven 聚合与继承
聚合在java 中是在A对象功能完整需要 另外B对象来实现,所以A类中有着B类对象的引用,但是A对象的生命周期结束,B对象依然可以存在,简而言之就两个对象的生命周期不同。当然在maven中,聚合又是为了解决另外一个问题而存在的一种机制。通常我们的项目都是都模块的,而每个模块又是一个 maven项目,所以每次开发完了编译都需要一个一个模块的去执行,这就违背了maven的自动化理念。
此时此刻我们使用maven构建项目时,B、C、D、E聚合在一起了
继承和聚合有相似的地方,继承的特性是指建立一个父模块,我们项目中的多个模块都做为该模块的子模块,将各个子模块相同的依赖和插件配置提取出来,从而简化配置文件,
此时我们在父工程A中的pom文件添加了三个依赖,就像项目经理要求我们必须用这个依赖的版本
但此时B、C、D、E四个子模块并没有得到来自父B的依赖,那是因为现在知识单方面A认了B、C、D、E,可他们四个还没认A为父,所以继承关系并不能产生
此时B、C、D、E与A有了继承关系,仅仅修改A中的pom文件,即可改动全部
补充
但实际开发中并不是这样的,A中的pom文件规定了本次项目所有依赖的版本号,到有些子模块并不需要全部继承,所以我们就需要在A中的pom文件添加<dependencyManagement>
标签来管理依赖,规定好所需版本号,子模块根据自己的需求在自己的pom文件中拿取(仅添加groupId及version) 或者额外添加(坐标GAV)
<!-- 父管理依赖的版本号 -->
<properties>
<!-- 自定义标签名 -->
<!--
通常管理依赖版本号的标签名称由 = 项目名称 + 字段version
-->
<junit-version>4.10</junit-version>
<mysql-connector-java-version>5.1.9</mysql-connector-java-version>
<servlet-api>2.5</servlet-api>
</properties>
<!-- 父工程要加强管理子模块的所有依赖 -->
<dependencyManagement>
<!-- 父工程添加的依赖,所有子模块会无条件继承 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java-version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet-api}</version>
</dependency>
</dependencies>
</dependencyManagement>