Maven實戰讀書筆記(五):聚合與繼承

Maven的聚合特性可以把項目的各個模塊聚合在一塊兒構建,而繼承特性則可以幫助抽取各模塊相同的依賴和插件等配置,在簡化POM的同時,還能促進各個模塊配置的一致性。web

5.1 聚合

Maven聚合也稱多模塊,可以一次構建多個模塊。聚合模塊自己是一個Maven項目,因此也有本身的POM文件,該POM文件的packagingpom,而且含有<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

5.2 繼承

繼承解決的是對重複依賴和插件配置的抽取。經過定義一個父模塊,將其餘模塊相同的配置抽離到父模塊中,而後繼承父模塊,而且父模塊也是一個Maven項目,其POM文件的packagingpommvc

子模塊須要增長<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.xmlMaven默認父POM在上一層目錄下。工具

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

groupId:項目組ID,項目座標的核心元素
version:項目版本,項目座標的核心元素
description:項目的描述信息
organization:項目所在組織機構信息
inceptionYear:項目的創始年份
url:項目的URL地址
developers:項目的開發者信息
contributors:項目的貢獻者信息
distributionManagement:項目的部署配置
issueManagement:項目的缺陷跟着系統信息
ciManagement:項目的持續集成系統信息
scm:項目的版本控制系統信息
mailingLists:項目的郵件列表信息
properties:自定義的Maven屬性
dependencies:項目的依賴配置
dependencyManagement:項目的依賴管理配置
repositories:項目的倉庫配置
build:項目的源碼目錄配置、輸出目錄配置、插件配置、插件配置管理等
reporting:項目的報告輸出目錄配置、報告插件配置等

5.3 聚合與繼承比較

Maven聚合

Maven繼承

對於Maven聚合,聚合模塊知道他聚合了哪些模塊,可是被聚合模塊不知道它本身被誰聚合了;
對於Maven繼承,子模塊知道本身的父模塊是誰,但父模塊不知道本身有多少子模塊。ui

在實際使用過程當中聚合模塊和父模塊是同一個模塊。

5.4 依賴管理

子模塊繼承父模塊時,也會繼承父模塊的依賴配置,假設添加一個util的子模塊,該模塊只提供一些簡單的幫助工具,與springframework徹底無關,難道也讓它依賴spring-corespring-beansspring-context麼?這顯然是不合理的。

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

在父POM使用dependencyManagement聲明的依賴可以統一項目範圍中依賴的版本,在子模塊使用依賴的時候就不須要版本了,只須要簡單的配置groupIdartifactId就能得到對應的依賴信息,從而引進正確的依賴。

若是子模塊不聲明依賴的使用,即便該依賴已經在父POMdependencyManagement中聲明瞭,也不會產生實際的效果。

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

對於子模塊而言,能夠按需添加依賴,對於整個項目而言,能夠規範對依賴的版本號管理。

相關文章
相關標籤/搜索