前言:
maven的聚合特性能把項目的各個模塊聚合在一起構建,maven的繼承特性則能幫助抽取各個模塊相同的依賴和插件等配置,在簡化POM的同時還成促進各個模塊配置的一致性。
測試類的包名結構和實際代碼保持一致,測試類中不測試實現,只測試接口,也就是說測試代碼不能引用實現類。
聚合:快速構建項目繼承:消除重複配置
聚合
方便一次構建聚合項目下的各個子模塊。打包方式爲pom,僅僅是幫助聚合其他模塊構建的工具,本身並無實質的內容。當在聚合模塊執行mvn命令時,首先會解析聚合模塊的POM,分析要構建的模塊,並計算出一個反應堆構建順序(Reactor Build Order),然後根據這個順序依次構建各個模塊。
繼承
父工程打包類型也必須爲pom。父模塊只是爲了幫助消除配置的重複,因此它本身不包含除POM之外的項目文件,也就不需要src/main/java/之類的文件夾了。
relativePath 表示父模塊POM的相對路徑。maven首先根據relativePath檢查父POM,如果找不到,再從本地倉庫查找。relativePath的默認值是../pom.xml。即maven中默認父pom是在上一層目錄下
可繼承的POM元素
- groupId:項目組ID
- version:項目版本
- description:項目描述信息
- organization:項目組織信息
- inceptionYear:項目創世年份
- url:項目URL地址
- developers:項目開發者信息
- contributors:項目貢獻者信息
- distributionManagement:項目部署配置
- issueManagement:項目缺陷跟蹤系統信息
- ciManagement:項目持續集成系統信息
- scm:項目版本控制系統信息
- mailingLists:郵件列表信息
- properites:自定義的Maven屬性
- dependencies:項目依賴配置
- dependencyManagement:依賴管理配置
- repositories:倉庫配置
- build:源碼目錄配置,輸出目錄配置,插件配置,插件管理配置等
- reporting:項目報告輸出目錄配置,報告插件配置等
依賴管理
由於dependencies元素可繼承,所以可以提取公共的項目依賴到父模塊中。dependencyManagement元素既能讓子模塊繼承到父模塊的依賴配置,又能保證子模塊依賴使用的靈活性。dependencyManagement元素下的依賴聲明不會引入實際的依賴,但它能約束dependencies下的依賴使用。引入其他pom的dependencyManagement合併到當前pom中。配置如下:在parent的pom.xml配置文件中加上如下配置,import依賴範圍只在dependencyManagement下有效
插件管理
pluginManagement該元素中配置的依賴不會造成實際的插件調用行爲,當POM中配置了真正的plugin元素,並且和pluginManagement中配置的插件匹配時,pluginManagement的配置纔會影響實際的插件行爲。當多個模塊引用相同的插件配置時,就將插件配置到父POM的pluginManagement中進行管理(統一聲明插件的版本),子插件在引用時,不需要配置版本等信息。聚合與集成的關係
聚合:快速構建項目繼承:消除重複配置Convention Over Configuration:約定優於配置maven默認規定:
- 源碼目錄 src/main/java
- 編譯輸出目錄 target/classes/
- 打包方式 jar
- 包輸出目錄 target/
也可自定義源碼路徑:(極度不建議),在build下配置超級POM:任何一個Maven項目都隱式地繼承自該POM,類似Java的Object類超級POM路徑:$MAVEN_HOME/lib/maven-model-builder-x.x.x.jar中的 org/apache/maven/model/pom-4.0.0.xml默認配置了倉庫和插件倉庫的地址,都是中央倉庫且都關閉了對SNAPSHOT的支持。也定義了maven項目的詳細信息
主輸出目錄,主代碼輸出目錄,最終構建的名稱,測試代碼輸出目錄,主源代碼目錄,腳本源代碼目錄,測試代碼目錄,主資源目錄和測試資源目錄
爲核心插件設定版本反應堆
在多模塊Maven項目中,反應堆(Reactor)指所有模塊組成的一個構建結構。包含了各個模塊間的繼承和依賴關係。單模塊項目,反應堆就是該模塊本身。反應堆的構建順序
maven按順序讀取POM,如果POM沒有依賴模塊,就構建該模塊,否則就先構建依賴的模塊,依次類推。模塊間的依賴關係會將反應堆構成一個有向非循環圖(Directed Acyclic Graph,DAG),即依賴關係不允許出現循環。裁剪反應堆
如果我們只需要構建完整反應堆中的某些個模塊,就需要使用下面這些mvn命令
- -am also make 同時構建所列模塊的依賴模塊
- -amd also make dependents 同時構建依賴於所列模塊的模塊
- -pl projects<arg> 構建指定的模塊,模塊間用逗號分隔
- -rf resume from<arg> 從定製模塊恢復反應堆
例子:
- -pl 從聚合模塊上只構建指定的模塊
clean install -DskipTests=true -pl hlp-ubp-facade,hlp-ubp-service
- -am 同時構建所列模塊的依賴模塊,hlp-ubp,hlp-ubp-facade都會被構建 -am
clean install -DskipTests=true -pl hlp-ubp-facade –am
- -amd 同時構建依賴於所列模塊的模塊,hlp-ubp-service,hlp-ubp-web模塊都被構建了
clean install -DskipTests=true -pl hlp-ubp-facade –amd
- 原來反應堆的構建順序
- -rf 指定從反應堆的哪個模塊開始構建
clean install -DskipTests=true -rf hlp-ubp-frontweb