繼承和聚合看似都是在主要的POM文件中作一下相應的配置,在實際操做過程當中每每只是知其然不知其因此然,不知道的可能很容易混淆。spring
繼承就是在從主pom那裏繼承許多重用的配置,能夠省去許多代碼量了。api
使用繼承方式的話,須要一個主POM,其packaging定義爲pom。它自己能夠不參與構建maven
<groupId>com.sd</groupId> <artifactId>sd.excel</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version>
此外還須要在子模塊中 定義父模塊的相關信息。 ui
<parent> <artifactId>sd.excel</artifactId> <groupId>com.sd</groupId> <version>1.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>sd.excel.base</artifactId> <name>sd.excel.base</name>
在parent元素中聲明的是父pom的GAV和父POM的相對路勁。 而後再聲明本身的GAV。 上圖的group和version省略了,緣由是從主POM那裏繼承了。url
除了groupId和Version 還有哪些元素能夠被繼承的呢?spa
groupId | 項目Id插件 |
version | 項目版本 |
description | 項目描述 |
organization | 項目組織信息 |
inceptionYear | 項目創始年份 |
url | 項目url地址 |
developers | 項目開發者 |
contributors | 項目貢獻者 |
distributionManagement | 項目部署配置 |
issueManagement | 項目缺陷跟蹤系統信息 |
ciManagement | 項目的持續集成系統信息 |
scm | 項目的版本控制系統信息 |
mailingList | 項目的郵件列表信息 |
properties | 自定義的maven屬性 |
dependencies | 項目的依賴配置 |
dependenciesManagement | 項目的依賴配置管理 |
repositories | 項目倉庫配置 |
build | 項目的構建配置,包括源碼,輸出目錄,插件配置等 |
reporting | 報告配置 |
所謂聚合,其實就是多模塊構建。面對較爲複雜的項目,一般都會被分爲不少相互依賴的模塊,而這些模塊是獨立構建,maven爲了應付這種相似的需求,設置了聚合方式。版本控制
使用聚合方式,須要組建一個主模塊或者說聚合模塊,它是用來管理組織那些小模塊。這個聚合模塊自己是不用構建的,excel
它只須要定義一個看似較爲特殊的POM便可。code
咱們以模塊 account-email和account-persist爲例,咱們爲此組建了一個名爲account-aggregator的聚合模塊。聚合模塊的POM長這樣:
<modelVersion>4.0.0</modelVersion> <groupId>com.sd</groupId> <artifactId>sd.excel</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>sd-excel-api</module> <module>sd-excel-base</module> </modules>
其中須要注意的地方是packaing 被定義爲POM,其次它額外聲明瞭 modules 在這裏面 添加了各個module的名字。
固然了,這只是創建在 主POM文件和 各模塊是父子層級關係的時候,固然也能夠是平行關係。見下圖
左圖是父子關係的層級圖,右圖是平行關係的層級圖。若是說只用層級關係的時候主POM中的module須要作相應的變化、
還有一點須要注意的是,各個被聚合模塊不知道其餘聚合模塊的存在,若是模塊之間有依賴關係,須要在本身的POM文件聲明GAV。
好在MAVEN會根據依賴關係,決定編譯打包順序。
DependencyManagement 內部聲名的依賴包 自己不會被項目引入, 若是項目使用的依賴包(包括隱形依賴,引入的一些包) 會優先從DependencyManagement裏面查詢對應的版本號,若是沒有則使用默認傳遞依賴的版本號。 用來解決maven衝突是個很好的辦法
如:在dependencyManagement 中定義了junit的版本和scope
<dependencyManagement> <dependencies> <!-- Testing --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement>
那麼在其餘地方,在使用junit的時候能夠不用定義 version和scope, 另外對於一些傳遞依賴導進來的junit 也會使用dependencyManagement中定義的版本和scope。
<dependencies> <!-- Testing --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.8.RELEASE</version> </dependency> </dependencies>