聚合與繼承

Maven的聚合特性能夠把項目的各個模塊聚合在一起構(gòu)建,而繼承特性則能夠幫助抽取各模塊相同的依賴和插件等配置,在簡化POM的同時,還能促進(jìn)各個模塊配置的一致性。

5.1 聚合

Maven聚合也稱多模塊,能夠一次構(gòu)建多個模塊。聚合模塊本身是一個Maven項目,所以也有自己的POM文件,該POM文件的packagingpom,并且含有<modules><module>元素,如:

<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的值都是一個當(dāng)前POM的相對目錄,一般而言,為了方便快速定位內(nèi)容,模塊所處的目錄名稱應(yīng)該與其artifactId一致,不過這不是Maven的要求。

因此,聚合模塊與其他模塊的目錄結(jié)構(gòu)并非一定要父子關(guān)系,通過修改module的值,也能更改為平級關(guān)系:
<module>../springboot-quickstart</module>

Maven首先會解析聚合模塊的POM,分析要構(gòu)建的模塊,并計算出一個反應(yīng)堆構(gòu)建順序,然后根據(jù)這個順序依次構(gòu)建各個模塊。反應(yīng)堆包含了模塊之間繼承和依賴的關(guān)系。模塊間的依賴關(guān)系會將反應(yīng)堆構(gòu)成一個有向非循環(huán)圖。

5.2 繼承

繼承解決的是對重復(fù)依賴和插件配置的抽取。通過定義一個父模塊,將其他模塊相同的配置抽離到父模塊中,然后繼承父模塊,并且父模塊也是一個Maven項目,其POM文件的packagingpom。

子模塊需要增加<parent>元素配置:

<parent>
   <artifactId>springboot.demo</artifactId>
   <groupId>com.wangdh</groupId>
   <version>1.0.0-SNAPSHOT</version>
  <relativePath>../pom.xml</relativePath>
</parent>

relativePath定義了父模塊POM文件的位置。默認(rèn)值為../pom.xmlMaven默認(rèn)父POM在上一層目錄下。

POM文件可被繼承的元素有:

groupId:項目組ID,項目坐標(biāo)的核心元素
version:項目版本,項目坐標(biāo)的核心元素
description:項目的描述信息
organization:項目所在組織機(jī)構(gòu)信息
inceptionYear:項目的創(chuàng)始年份
url:項目的URL地址
developers:項目的開發(fā)者信息
contributors:項目的貢獻(xiàn)者信息
distributionManagement:項目的部署配置
issueManagement:項目的缺陷跟著系統(tǒng)信息
ciManagement:項目的持續(xù)集成系統(tǒng)信息
scm:項目的版本控制系統(tǒng)信息
mailingLists:項目的郵件列表信息
properties:自定義的Maven屬性
dependencies:項目的依賴配置
dependencyManagement:項目的依賴管理配置
repositories:項目的倉庫配置
build:項目的源碼目錄配置、輸出目錄配置、插件配置、插件配置管理等
reporting:項目的報告輸出目錄配置、報告插件配置等

5.3 聚合與繼承比較

Maven聚合
Maven繼承

對于Maven聚合,聚合模塊知道他聚合了哪些模塊,但是被聚合模塊不知道它自己被誰聚合了;
對于Maven繼承,子模塊知道自己的父模塊是誰,但父模塊不知道自己有多少子模塊。

在實(shí)際使用過程中聚合模塊和父模塊是同一個模塊。

5.4 依賴管理

子模塊繼承父模塊時,也會繼承父模塊的依賴配置,假設(shè)添加一個util的子模塊,該模塊只提供一些簡單的幫助工具,與springframework完全無關(guān),難道也讓它依賴spring-core、spring-beans、spring-context么?這顯然是不合理的。

Maven提供的dependencyManagement元素既能讓子模塊繼承父模塊的依賴配置,又能保證子模塊依賴使用的靈活性。在dependencyManagement元素下聲明的依賴不會引入實(shí)際的依賴,不過它能夠約束dependencies下的依賴使用。

在父POM使用dependencyManagement聲明的依賴能夠統(tǒng)一項目范圍中依賴的版本,在子模塊使用依賴的時候就不需要版本了,只需要簡單的配置groupIdartifactId就能獲得對應(yīng)的依賴信息,從而引進(jìn)正確的依賴。

如果子模塊不聲明依賴的使用,即使該依賴已經(jīng)在父POMdependencyManagement中聲明了,也不會產(chǎn)生實(shí)際的效果。

如,在父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>

對于子模塊而言,可以按需添加依賴,對于整個項目而言,可以規(guī)范對依賴的版本號管理。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 好久沒有更新了,在這里給大家說聲抱歉,實(shí)在是因?yàn)樽罱影嗝Τ晒?,還有一個原因是我想把《maven實(shí)戰(zhàn)》這本書剩下的...
    小煉君閱讀 1,530評論 0 51
  • 一、聚合 為了能夠使用一條命令就能構(gòu)建 account-email和 account-persist兩個模塊,我們...
    madfrog_hc閱讀 412評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,697評論 19 139
  • 一、聚合為了能夠使用一條命令就能構(gòu)建 account-email和 account-persist兩個模塊,我們需...
    wyatt_plus閱讀 2,393評論 0 3
  • 我的本命年,我要炫到飛起來,別懷疑。
    MISS__Y閱讀 107評論 0 0

友情鏈接更多精彩內(nèi)容