Maven學習6: 聚合和繼承

1. maven聚合

1.1 爲何使用聚合?

假設一個項目包含兩個模塊,咱們想要一次構建兩個模塊,而不是到兩個模塊的目錄下分別執行mvn命令,這時就須要用到聚合。apache

1.2 聚合配置

  1. 聚合模塊pom配置maven

    • 聚合模塊packaging類型爲 pom
    • 聚合模塊包含 modules元素,每一個module對應一個要被聚合的子模塊。
    • module的值是當前pom的相對目錄。
    • 具體配置工具

      <modules>
          <module>模塊1</module>
          <module>模塊2</module>
          <module>模塊3</module>
      </modules>
  2. 聚合模塊相對位置ui

    • 一般將聚合模塊放在項目目錄的最頂層,其餘模塊做爲聚合模塊的子目錄。
  3. 聚合模塊意義url

    • 聚合模塊僅僅是幫助聚合其餘模塊構建的工具,自己並沒有實質內容。
    • 解決同時構建多個模塊的問題。
  4. 聚合模塊構建插件

    • maven首先會解析聚合模塊的pom,分析要構建的模塊,並計算出一個反應堆構建順序(Reactor Build Order),而後根據這個順序依次構建各個模塊。

2. maven繼承

2.1 爲何使用繼承?

解決重複配置問題。版本控制

2.2 繼承配置

  1. 項目繼承的配置code

    • 父模塊的packaging類型爲pom
    • 子模塊須要配置project -> parent元素信息xml

      • 父模塊座標配置,groupId:artifactId:version
      • relativePath: 父模塊pom文件所在路徑,默認父pom在上一層目錄下(即 ../pom.xml)。
      • 構建過程當中,maven會根據relativePath檢查父pom,若是找不到,再從本地倉庫查找。
    • 子模塊繼承父模塊的配置繼承

      <parent>
          <groupId>父構件groupId</groupId>
          <artifactId>父構件artifactId</artifactId>
          <version>父構件的版本號</version>
          <relativePath>父構件pom.xml路徑</relativePath>
      </parent>
  2. 可繼承的pom元素

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

    • maven提供的dependencyManagement元素既能讓子模塊繼承到父模塊的依賴配置,又能保證子模塊依賴使用的靈活性.
    • dependencyManagement元素下的依賴聲明不會引入實際的依賴,可是它能約束對dependencies下的依賴使用。
    • import依賴範圍:

      • 將目標pom中dependencyManagement配置導入,併合併到當前項目的dependencyManagement元素中。
      • 不想使用繼承的方式,來達到使用目標pom中的依賴的目的。
      • import依賴範圍通常都指向打包類型爲pom的模塊。

        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>targetGroupId</groupId>
                    <artifactId>targetArtifactId</artifactId>
                    <version>targetVersion</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>構件1</dependency>
                <dependency>構件2</dependency>
            </dependencies>
        </dependencyManagement>
  4. 插件管理

    • maven中提供了dependencyManagement來幫助管理依賴繼承,也提供了pluginManagement元素幫助管理插件繼承。
    • 在父模塊pom中該元素的配置不會形成實際的插件調用行爲,只有在子pom.xml中配置plugins -> plugin元素聲明該插件的時候,插件纔會起效。
    • 子pom插件中只須要寫groupId、artifactId,其餘信息均可以從父pom中傳遞過來。
    • 舉例,使用maven-source-plugin插件生成項目源碼包,將該插件的jar-no-fork目標綁定到default生命週期的verify階段。

      • 父pom插件管理配置

        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-source-plugin</artifactId>
                        <version>3.2.1</version>
                        <executions>
                            <execution>
                                <id>attach-source</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>jar-no-fork</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
      • 子pom插件聲明配置

        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-source-plugin</artifactId>
                </plugin>
            </plugins>
        </build>

3. 聚合與繼承

  1. 目的

    • 聚合主要是爲了方便快速構建多模塊項目。
    • 繼承主要是爲了消除重複配置。
  2. 與其餘模塊關係

    • 對於聚合模塊來講,聚合模塊知道有哪些被聚合的模塊,而被聚合模塊不知道聚合模塊的存在。
    • 對於繼承來講,父模塊是不知道有哪些子模塊繼承它,而子模塊須要使用parent來引用父模塊。
  3. 共同點

    • 聚合模塊和繼承中的父模塊的packaging屬性都必須是pom類型的。
    • 同時,聚合模塊和父模塊除了pom.xml,通常都沒有實際內容。
  4. 實際使用

    • 將聚合和繼承一塊兒使用,能同時使用到二者的優勢。

4. 反應堆

4.1 介紹

  1. 反應堆

    • 多模塊的maven項目中,反應堆(Reactor)是指全部模塊組成的一個構建結構
  2. 單模塊項目的反應堆

    • 就是該模塊自己。
  3. 多模塊項目的反應堆

    • 包含模塊之間繼承與依賴的關係,從而可以自動計算出合理的模塊構建順序。

4.2 反應堆構建順序

  • maven按聚合配置中的順序讀取pom。
  • 若是該pom沒有依賴模塊,那麼就構建該模塊,不然就先構建其依賴的模塊,若是該依賴還依賴於其餘模塊,則進一步先構建依賴的依賴。

4.3 裁剪反應堆

  1. 說明

    • 通常狀況下,用戶會選擇構建整個項目或者選擇構建單個模塊。
    • 若是想要僅僅構建完整反應堆中的某些模塊,就須要實時的裁剪反應堆
  2. 裁剪反應堆選項

    • 執行mvn -h能夠看到裁剪反應堆的選項。
    • -am:--also-make, 同時構建所列模塊的依賴模塊。
    • -amd:-also-make-dependencies,同時構建依賴於所列模塊的模塊。
    • -pl:--projects <arg>,構建指定的模塊,模塊之間使用逗號分隔
    • -rf:-resume-from <arg>,從指定的模塊繼續反應堆
相關文章
相關標籤/搜索