Maven的聚合模塊和繼承

最近從新讀了一下《Maven實戰》,記錄一下一直被我忽略的聚合繼承的關係。spa

聚合

首先,一個模塊有一個pom(Project object Model)文件。當一個項目比較大的時候,按必定規則劃分紅不一樣的模塊是一個比較好的方式。這時候管理一個項目,若是每一個模塊座位一個項目,那麼打包編譯的時候須要到每個模塊下去執行mvn命令,太麻煩了。因而,有個繼承模塊。code

繼承模塊是一個空模塊,只有pom文件,沒有src、resource之類的目錄結構。在pom文件中,用<modules><module>標籤指定要管理的子模塊。另外,<packaging>標籤必須指定爲pom。xml

  • e.g:
<packaging>pom</packaging>
    <modules>
            <module>account-model</module>
            <module>account-service</module>
            <module>account-task</module>
    </modules>
複製代碼

以上狀況適用於聚合模塊處於目錄頂層,子模塊是聚合模塊的子目錄的狀況。若是子模塊和聚合模塊是平行的目錄關係,那麼應該根據實際路徑來寫。繼承

  • e.g:
<packaging>pom</packaging>
    <modules>
            <module>../account-model</module>
            <module>../account-service</module>
            <module>../account-task</module>
    </modules>
複製代碼

這樣,一個聚合模塊就作好了,打包編譯只須要在聚合模塊下執行命令便可。ci

繼承

當多個子模塊須要的依賴相同和重複時,就推薦使用繼承來消除重複了。聲明一個可被繼承的父模塊,也是要把<packaging>標籤指定爲pom。子模塊中指定父模塊的座標io

  • e.g:
<parent>
    <groupId>com.demo</groupId>
    <artifactId>account-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
複製代碼

父模塊中能夠聲明<dependencyManagement>,這個標籤不會真的引入依賴,只是定義公用的座標,子模塊繼承後仍然須要指定<groupId><artifactId>,可省略<version>標籤。這麼作看起來沒節省多少工做,可是能有效管理依賴,避免項目出現不一樣版本的依賴問題。編譯

若是父模塊和子模塊是平行目錄,那麼子模塊中須要指定父模塊的地址。class

  • e.g:
<parent>
    <groupId>com.demo</groupId>
    <artifactId>account-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../account-parent/pom.xml</relativePath>
  </parent>
複製代碼

Maven默認是從上級目錄解析父模塊,因此若是子模塊在父模塊的下級目錄,可省略<relativePath>import

通常推薦頂層目錄中聲明模塊,它便是聚合模塊,也是可被繼承的父模塊module

import依賴範圍

一直不知道import依賴範圍的做用,這裏記錄一下。

這個依賴範圍,只在<dependencyManagement>元素下才有效。 它的做用是指向一個pom,將目標pom中的<dependencyManagement>配置導入而且合併到當前pom的<dependencyManagement>中。 也就是說,一個新模塊的<dependencyManagement>中,有一堆配置在其餘某個pom中的<dependencyManagement>裏配置過了,此處就沒必要再複製粘貼一遍,能夠直接使用import引入進來。

  • e.g:有一個現成的a-parent模塊配置了<dependencyManagement>,在b-parent模塊中就沒必要拷貝大段配置了
<dependencyManagement>
    <dependencies>
            <dependency>
                <groupId>com.demo</groupId>
                <artifactId>a-parent</artifactId>
                <version>0.0.1-SNAPSHOT</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
    </dependencies>        
  </dependencyManagement>
複製代碼
相關文章
相關標籤/搜索