(一)Maven詳解之聚合與繼承

說到聚合與繼承咱們都很熟悉,maven一樣也具有這樣的設計原則,下面咱們來看一下Maven的pom如何進行聚合與繼承的配置實現。html


1、爲何要聚合?java

隨着技術的飛速發展和各種用戶對軟件的要求愈來愈高,軟件自己也變得愈來愈複雜,而後軟件設計人員開始採用各類方式進行開發,因而就有了咱們的分層架構、分模塊開發,來提升代碼的清晰和重用。針對於這一特性,maven也給予了相應的配置。spring

情景分析一:apache

咱們在開發過程當中,建立了2個以上的模塊,每一個模塊都是一個獨立的maven project,在開始的時候咱們能夠獨立的編譯和測試運行每一個模塊,可是隨着項目的不斷變大和複雜化,咱們指望可以使用簡單的操做來完成編譯等工做,這時Maven給出了聚合的配置方式。編程

所謂聚合,顧名思義,就是把多個模塊或項目聚合到一塊兒,咱們能夠創建一個專門負責聚合工做的Maven project ---  aggregator。安全

創建該project的時候,咱們要注意如下幾點:架構

1.該aggregator自己也作爲一個Maven項目,它必須有本身的POMmaven

2.它的打包方式必須爲: packaging工具

3.引入了新的元素:modules---module測試

4.版本:聚合模塊的版本和被聚合模塊版本一致

5.relative path:每一個module的值都是一個當前POM的相對目錄

6.目錄名稱:爲了方便的快速定位內容,模塊所處的目錄應當與其artifactId一致(Maven約定而不是硬性要求),總之,模塊所處的目錄必須和<module>模塊所處的目錄</module>相一致。

7.習慣約定:爲了方便構建,一般將聚合模塊放在項目目錄層的最頂層,其它聚合模塊做爲子目錄存在。這樣當咱們打開項目的時候,第一個看到的就是聚合模塊的POM

8.聚合模塊減小的內容:聚合模塊的內容僅僅是一個pom.xml文件,它不包含src/main/java、src/test/java等目錄,由於它只是用來幫助其它模塊構建的工具,自己並無實質的內容。

9.聚合模塊和子模塊的目錄:他們能夠是父子類,也能夠是平行結構,固然若是使用平行結構,那麼聚合模塊的POM也須要作出相應的更改。

2、爲何要繼承?

作面向對象編程的人都會以爲這是一個沒意義的問題,是的,繼承就是避免重複,maven的繼承也是這樣,它還有一個好處就是讓項目更加安全

情景分析二:咱們在項目開發的過程當中,可能多個模塊獨立開發,可是多個模塊可能依賴相同的元素,好比說每一個模塊都須要Junit,使用spring的時候,其核心jar也必須都被引入,在編譯的時候,maven-compiler-plugin插件也要被引入

如何配置繼承:

1.說到繼承確定是一個父子結構,那麼咱們在aggregator中來建立一個parent project

2.<packaging>: 做爲父模塊的POM,其打包類型也必須爲POM

3.結構:父模塊只是爲了幫助咱們消除重複,因此它也不須要src/main/java、src/test/java等目錄

4.新的元素:<parent> , 它是被用在子模塊中的

5.<parent>元素的屬性:<relativePath>: 表示父模塊POM的相對路徑,在構建的時候,Maven會先根據relativePath檢查父POM,若是找不到,再從本地倉庫查找

6.relativePath的默認值: ../pom.xml

7.子模塊省略groupId和version: 使用了繼承的子模塊中能夠不聲明groupId和version, 子模塊將隱式的繼承父模塊的這兩個元素

3、可被繼承的POM元素

groupId:項目組ID,項目座標的核心元素

version: 項目版本, 項目座標的核心元素

description: 項目的描述信息

organization: 項目的組織信息

inceptionYear: 項目的創始年份

url: 項目的URL地址

developers: 項目開發者信息

contributors: 項目的貢獻者信息

distributionManagement: 項目的部署配置

issueManagement: 項目的缺陷跟蹤系統信息

ciManagement: 項目的持續集成系統信息

scm: 項目的版本控制系統信息

mailingLists: 項目的郵件列表信息

properties: 自定義的maven屬性

dependencies: 項目的依賴配置

dependencyManagement: 項目的依賴管理配置

repositories: 項目的倉庫配置

build: 包括項目的源碼目錄配置、輸出目錄配置、插件配置、插件管理配置等

reporting: 包括項目的報告輸出目錄配置、報告插件配置等

4、maven的依賴管理

咱們知道dependencies是能夠被繼承的,這個時候咱們就想到讓咱們的發生了共用的依賴元素轉移到parent中,這樣咱們又進一步的優化了配置。但是問題也隨之而來,若是有一天我建立了一個新的模塊,可是這個模塊不須要這些parent的依賴,這時候如何處理?

是的,maven的依賴管理就是來解決這個問題的

增長一個新的元素:dependencyManagement

從上面的列表中咱們發現dependencyManagement也是能夠被繼承的,這偏偏知足了咱們的須要,它既可以讓子模塊繼承到父模塊的依賴配置,又能保證子模塊依賴使用的靈活性

dependencyManagement的特性:在dependencyManagement中配置的元素既不會給parent引入依賴,也不會給它的子模塊引入依賴,僅僅是它的配置是可繼承的

最佳實踐:

這時候咱們就能夠在父POM中聲明這些依賴:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. <span style="white-space:pre">    </span><properties>  

  2.         <target.version>2.5.6</target.version>  

  3.     </properties>  

  4.   

  5.     <dependencyManagement>  

  6.         <dependencies>  

  7.             <dependency>  

  8.                 <groupId>your groupId</groupId>  

  9.                 <artifactId>your artifactId</artifactId>  

  10.                 <version>${target.version}</version>  

  11.             </dependency>  

  12.         </dependencies>  

  13.     </dependencyManagement>  


子模塊的POM繼承這些配置:子模塊繼承這些配置的時候,仍然要聲明groupId和artifactId,表示當前配置是繼承於父POM的,從而直接使用父POM的版本對應的資源

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. <span style="white-space:pre">        </span><dependencies>  

  2.             <dependency>  

  3.                 <groupId>your groupId</groupId>  

  4.                 <artifactId>your artifactId</artifactId>  

  5.             </dependency>  

  6.         </dependencies>  


這個能夠有效的避免多個子模塊使用依賴版本不一致的狀況,有助於下降依賴衝突的概率。注:只有子模塊配置了繼承的元素,纔會真正的有效,不然maven是不會加載父模塊中聲明的元素。

5、Maven的插件管理

再增長一個新的元素:<pluginManagement>

這個元素和<dependencyManagement>相相似,它是用來進行插件管理的。

在咱們項目開發的過程當中,也會頻繁的引入插件,因此解決這些複雜配置的方法就是使用插件管理

咱們能夠在父POM中作以下聲明:

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. <span style="white-space:pre">    </span><build>  

  2.         <pluginManagement>  

  3.             <plugins>  

  4.                 <plugin>  

  5.                     <groupId></groupId>  

  6.                     <artifactId></artifactId>  

  7.                     <version></version>  

  8.                     <executions>  

  9.                         <execution>  

  10.                             <id></id>  

  11.                             <goals>  

  12.                                 <goal></goal>  

  13.                             </goals>  

  14.                             <phase></phase>  

  15.                             <configuration>  

  16.                                 <source></source>  

  17.                                 <target></target>  

  18.                             </configuration>  

  19.                         </execution>  

  20.                     </executions>  

  21.                 </plugin>  

  22.             </plugins>  

  23.         </pluginManagement>  

  24.     </build>  



在子模塊中,咱們能夠直接繼承

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. <span style="white-space:pre">    </span><build>  

  2.         <plugins>  

  3.             <plugin>  

  4.                 <groupId>org.apache.maven.plugins</groupId>  

  5.                 <artifactId>maven-compiler-plugin</artifactId>  

  6.             </plugin>  

  7.         </plugins>  

[html] view plaincopy在CODE上查看代碼片派生到個人代碼片

  1. <pre name="code" class="html"><span style="white-space:pre">    </span></build>  


咱們會發現,繼承的細節上和<dependencyManagement>幾乎同樣。


6、聚合與繼承的總結

當咱們明白聚合與繼承的細節以後,咱們會發現:

對於聚合模塊來講,它知道有哪些被聚合的模塊,而對於被聚合的模塊來講,它們不知道被誰聚合了,也不知道它的存在

對於繼承關係的父POM來講,它不知道本身被哪些子模塊繼承了,對於子POM來講,它必須知道本身的父POM是誰

在一些最佳實踐中咱們會發現:一個POM既是聚合POM,又是父POM,這麼作主要是爲了方便。

相關文章
相關標籤/搜索