最近從新讀了一下《Maven實戰》,記錄一下一直被我忽略的聚合
和繼承
的關係。spa
首先,一個模塊有一個pom(Project object Model)文件。當一個項目比較大的時候,按必定規則劃分紅不一樣的模塊是一個比較好的方式。這時候管理一個項目,若是每一個模塊座位一個項目,那麼打包編譯的時候須要到每個模塊下去執行mvn命令,太麻煩了。因而,有個繼承模塊。code
繼承模塊是一個空模塊,只有pom文件,沒有src、resource之類的目錄結構。在pom文件中,用<modules>
和<module>
標籤指定要管理的子模塊。另外,<packaging>
標籤必須指定爲pom。xml
<packaging>pom</packaging>
<modules>
<module>account-model</module>
<module>account-service</module>
<module>account-task</module>
</modules>
複製代碼
以上狀況適用於聚合模塊處於目錄頂層,子模塊是聚合模塊的子目錄的狀況。若是子模塊和聚合模塊是平行的目錄關係,那麼應該根據實際路徑來寫。繼承
<packaging>pom</packaging>
<modules>
<module>../account-model</module>
<module>../account-service</module>
<module>../account-task</module>
</modules>
複製代碼
這樣,一個聚合模塊就作好了,打包編譯只須要在聚合模塊下執行命令便可。ci
當多個子模塊須要的依賴相同和重複時,就推薦使用繼承來消除重複了。聲明一個可被繼承的父模塊,也是要把<packaging>
標籤指定爲pom。子模塊中指定父模塊的座標io
<parent>
<groupId>com.demo</groupId>
<artifactId>account-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
複製代碼
父模塊中能夠聲明<dependencyManagement>
,這個標籤不會真的引入依賴,只是定義公用的座標,子模塊繼承後仍然須要指定<groupId>
和<artifactId>
,可省略<version>
標籤。這麼作看起來沒節省多少工做,可是能有效管理依賴,避免項目出現不一樣版本的依賴問題。編譯
若是父模塊和子模塊是平行目錄,那麼子模塊中須要指定父模塊的地址。class
<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依賴範圍的做用,這裏記錄一下。
這個依賴範圍,只在<dependencyManagement>
元素下才有效。 它的做用是指向一個pom,將目標pom中的<dependencyManagement>
配置導入而且合併到當前pom的<dependencyManagement>
中。 也就是說,一個新模塊的<dependencyManagement>
中,有一堆配置在其餘某個pom中的<dependencyManagement>
裏配置過了,此處就沒必要再複製粘貼一遍,能夠直接使用import引入進來。
<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>
複製代碼