一、為什么要聚合?
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依賴

至此 繼承就解決了 統一依賴版本的問題。
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

從圖中可以看出所有的模塊都執行了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
- 規范
- 數據庫