Maven
的聚合特性可以把項目的各個模塊聚合在一塊兒構建,而繼承特性則可以幫助抽取各模塊相同的依賴和插件等配置,在簡化POM
的同時,還能促進各個模塊配置的一致性。web
Maven
聚合也稱多模塊,可以一次構建多個模塊。聚合模塊自己是一個Maven
項目,因此也有本身的POM
文件,該POM
文件的packaging
爲pom
,而且含有<modules>
和<module>
元素,如:spring
<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.wangdh</groupId> <artifactId>springboot.demo</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>springboot-mybatis</module> <module>springboot-web</module> <module>springboot-quickstart</module> </modules> </project>
這裏每一個module
的值都是一個當前POM
的相對目錄,通常而言,爲了方便快速定位內容,模塊所處的目錄名稱應該與其artifactId
一致,不過這不是Maven
的要求。apache
所以,聚合模塊與其餘模塊的目錄結構並不是必定要父子關係,經過修改module
的值,也能更改成平級關係:
<module>../springboot-quickstart</module>
springboot
Maven
首先會解析聚合模塊的POM
,分析要構建的模塊,並計算出一個反應堆構建順序,而後根據這個順序依次構建各個模塊。反應堆包含了模塊之間繼承和依賴的關係。模塊間的依賴關係會將反應堆構成一個有向非循環圖。mybatis
繼承解決的是對重複依賴和插件配置的抽取。經過定義一個父模塊,將其餘模塊相同的配置抽離到父模塊中,而後繼承父模塊,而且父模塊也是一個Maven
項目,其POM
文件的packaging
爲pom
。mvc
子模塊須要增長<parent>
元素配置:maven
<parent> <artifactId>springboot.demo</artifactId> <groupId>com.wangdh</groupId> <version>1.0.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent>
relativePath
定義了父模塊POM
文件的位置。默認值爲../pom.xml
,Maven
默認父POM
在上一層目錄下。工具
POM
文件可被繼承的元素有:性能
groupId:項目組ID,項目座標的核心元素 version:項目版本,項目座標的核心元素 description:項目的描述信息 organization:項目所在組織機構信息 inceptionYear:項目的創始年份 url:項目的URL地址 developers:項目的開發者信息 contributors:項目的貢獻者信息 distributionManagement:項目的部署配置 issueManagement:項目的缺陷跟着系統信息 ciManagement:項目的持續集成系統信息 scm:項目的版本控制系統信息 mailingLists:項目的郵件列表信息 properties:自定義的Maven屬性 dependencies:項目的依賴配置 dependencyManagement:項目的依賴管理配置 repositories:項目的倉庫配置 build:項目的源碼目錄配置、輸出目錄配置、插件配置、插件配置管理等 reporting:項目的報告輸出目錄配置、報告插件配置等
對於Maven
聚合,聚合模塊知道他聚合了哪些模塊,可是被聚合模塊不知道它本身被誰聚合了;
對於Maven
繼承,子模塊知道本身的父模塊是誰,但父模塊不知道本身有多少子模塊。ui
在實際使用過程當中聚合模塊和父模塊是同一個模塊。
子模塊繼承父模塊時,也會繼承父模塊的依賴配置,假設添加一個util
的子模塊,該模塊只提供一些簡單的幫助工具,與springframework
徹底無關,難道也讓它依賴spring-core
、spring-beans
、spring-context
麼?這顯然是不合理的。
Maven
提供的dependencyManagement
元素既能讓子模塊繼承父模塊的依賴配置,又能保證子模塊依賴使用的靈活性。在dependencyManagement
元素下聲明的依賴不會引入實際的依賴,不過它可以約束dependencies
下的依賴使用。
在父POM
使用dependencyManagement
聲明的依賴可以統一項目範圍中依賴的版本,在子模塊使用依賴的時候就不須要版本了,只須要簡單的配置groupId
和artifactId
就能得到對應的依賴信息,從而引進正確的依賴。
若是子模塊不聲明依賴的使用,即便該依賴已經在父POM
的dependencyManagement
中聲明瞭,也不會產生實際的效果。
如,在父POM
定義以下dependencyManagement
:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.14.RELEASE</version> </dependency> </dependencies> </dependencyManagement>
在子模塊使用時,只須要:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency>
對於子模塊而言,能夠按需添加依賴,對於整個項目而言,能夠規範對依賴的版本號管理。