一、为什么要聚合?
1、项目分模块开发,如果模块较多,在执行clean、package等构建相关操作时,费事费力!也不符合maven的自动化管理初衷,所以利用聚合可以管理多个模块的操作。
2、聚合模块和子模块的目录:他们可以是父子类(上下级目录),也可以是平行结构,当然如果使用平行结构,那么聚合模块的POM也需要做出相应的更改。
二、为什么需要继承
多模块那就是不同的组甚至是不同的部门来开发,比如junit依赖的version 很有可能就会不一样,但是为了项目后期维护以及项目人员调度尽可能的方便,我们需要将junit的版本设为统一的。所以就需要有一个机制来给统一这个标准,maven提供了一种机制就是 继承。继承可以提供对多模块的管理,提高复用性!
通过定义一个父工程,并且在该父工程的 pom 文件中使用 dependencyManagement来声明junit的统一version
父工程的pom.xml
```
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.javxuam.maven</groupId>
<artifactId>MavenProject</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
```
2.A模块继承父工程pom.xml,定义junit依赖时候不声明version,去除A中pom.xml 与父工程pom.xml中重复的部分
```
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>MavenProject</artifactId>
<groupId>com.javxuam.maven</groupId>
<version>1.0-SNAPSHOT</version>
<!--最好声明一下以当前pom文件目录为基准
的父工程的pom文件-->
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<!--本来A模块也是需要 三点确定的,
但是 groupId 与version与父工程的相同
所以去掉,不去掉也不会报错-->
<groupId>com.javxuam.maven</groupId>
<artifactId>A</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--不声明version-->
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
</dependencies>
</project>
```
同样给 B,C模块继承父模块,再查看A,B,C三个模块的junit依赖
![](https://box.kancloud.cn/99509d493bfdd8ee21b0ea966dc1fe3e_358x530.png)
至此 继承就解决了 统一依赖版本的问题。
2.聚合
聚合在java 中是在A对象功能完整需要 另外B对象来实现,所以A类中有着B类对象的引用,但是A对象的生命周期结束,B对象依然可以存在,简而言之就两个对象的生命周期不同。当然在maven中,聚合又是为了解决另外一个问题而存在的一种机制。通常我们的项目都是都模块的,而每个模块又是一个 maven项目,所以每次开发完了编译都需要一个一个模块的去执行,这就违背了maven的自动化理念。
所以聚合应运而生,具体做法:
```
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.javxuam.maven</groupId>
<artifactId>MavenProject</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>A</module>
<module>B</module>
<module>C</module>
<module>D</module>
<module>WebProject</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
```
然后执行一下 父模块的 clean 看 A,B,C,D模块是否也会一起clean
![](https://box.kancloud.cn/b26614bdb25ca4a8395c21544327bb8f_1328x434.png)
从图中可以看出所有的模块都执行了clean,这就避免了一个一个模块的clean操作了。
3 继承与聚合容易混淆的点
3.1 子模块并不一定是父项目的子模块(子模块只是一种称呼,并不一定真的是有继承关系的)
如:A项目下有 a,b,c三个子模块
A项目的pom.xml
```
<modules>
<module>a</module>
<module>b</module>
<module>c</module>
</modules>
```
a,b,c项目的pom.xml不一定有如下定义
```
<parent>
<artifactId>A</artifactId>
<groupId>com.javxuam.maven</groupId>
<version>1.0-SNAPSHOT</version>
<!--最好声明一下以当前pom文件目录为基准
的父工程的pom文件-->
<relativePath>../pom.xml</relativePath>
</parent>
```
3.2 聚合的目的只是为了把大型分模块项目的 clean package test等操作的简化, 有了聚合 对顶级项目 执行 mvn clean ,package等命令时 下的子模块 也会自动执行
借鉴:https://blog.csdn.net/u014297148/article/details/79939656
- 计算机网络
- 基础_01
- tcp/ip
- http转https
- Let's Encrypt免费ssl证书(基于haproxy负载)
- what's the http?
- 网关
- 网络IO
- http
- 工具
- Git
- 初始本地仓库并上传
- git保存密码
- Gitflow
- maven
- 1.生命周期命令
- 聚合与继承
- 插件管理
- assembly
- 资源管理插件
- 依赖范围
- 分环境打包
- dependencyManagement
- 版本分类
- 找不到主类
- 无法加载主类
- 私服
- svn
- gradle
- 手动引入第三方jar包
- 打包exe文件
- Windows
- java
- 设计模式
- 七大原则
- 1.开闭原则
- 2. 里式替换原则
- 3. 依赖倒置原则
- 4. 单一职责原则
- 单例模式
- 工厂模式
- 简单工厂
- 工厂方法模式
- 抽象工厂模式
- 观察者模式
- 适配器模式
- 建造者模式
- 代理模式
- 适配器模式
- 命令模式
- json
- jackson
- poi
- excel
- easy-poi
- 规则
- 模板
- 合并单元格
- word
- 读取
- java基础
- 类路径与jar
- 访问控制权限
- 类加载
- 注解
- 异常处理
- String不可变
- 跨域
- transient关键字
- 二进制编码
- 泛型1
- 与或非
- final详解
- Java -jar
- 正则
- 读取jar
- map
- map计算
- hashcode计算原理
- 枚举
- 序列化
- URLClassLoader
- 环境变量和系统变量
- java高级
- java8
- 1.Lambda表达式和函数式接口
- 2.接口的默认方法和静态方法
- 3.方法引用
- 4.重复注解
- 5.类型推断
- 6.拓宽注解的应用场景
- java7-自动关闭资源机制
- 泛型
- stream
- 时区的正确理解
- StringJoiner字符串拼接
- 注解
- @RequestParam和@RequestBody的区别
- 多线程
- 概念
- 线程实现方法
- 守护线程
- 线程阻塞
- 笔试题
- 类加载
- FutureTask和Future
- 线程池
- 同步与异步
- 高效简洁的代码
- IO
- ThreadLocal
- IO
- NIO
- 图片操作
- KeyTool生成证书
- 压缩图片
- restful
- 分布式session
- app保持session
- ClassLoader.getResources 能搜索到的资源路径
- java开发规范
- jvm
- 高并发
- netty
- 多线程与多路复用
- 异步与事件驱动
- 五种IO模型
- copy on write
- code style
- 布隆过滤器
- 笔试
- 数据库
- mybatis
- mybatis与springboot整合配置
- pagehelper
- 分页数据重复问题
- Java与数据库之间映射
- 拦截器
- 拦截器应用
- jvm
- 堆内存测试
- 线程栈
- 直接内存
- 内存结构
- 内存模型
- 垃圾回收
- 调优
- 符号引用
- 运行参数
- 方法区
- 分带回收理论
- 快捷开发
- idea插件
- 注释模板
- git
- pull冲突
- push冲突
- Excel处理
- 图片处理
- 合并单元格
- easypoi
- 模板处理
- 响应式编程
- reactor
- reactor基础
- jingyan
- 规范
- 数据库