Maven的聚合与继承
(尊重勞動成果,轉載請注明出處:https://blog.csdn.net/qq_25827845/article/details/83867717冷血之心的博客)
關注微信公眾號(文強的技術小屋),學習更多技術知識,一起遨游知識海洋~
快速導航:
Maven基礎概念和安裝配置教程
Maven的倉庫和settings.xml配置文件
Maven的坐標與依賴
Maven的生命周期和插件
Maven的聚合與繼承
目錄
聚合
繼承
聚合和繼承的關系
反應堆
裁剪反應堆
總結
? ? ? ? ?在上邊的學習中,我們介紹了Maven是一種強大的構建工具,能夠幫助我們自動下載構件,并且通過給每一個構件確定其坐標,實現了構件在倉庫中的存儲。正是Maven的生命周期和插件的互相綁定才使得我們可以非常愉快的完成項目的構建。在實際的項目中,我們往往會建立多個模塊(module)。我們在本文中要介紹的聚合和繼承就特別適合多個模塊的協同工作。? ?
Maven的聚合特性可以幫助我們把項目的多個模塊聚合在一起,使用一條命令進行構建,即一條命令實現構建多個項目;
Maven的繼承特性可以將各個模塊相同的依賴和插件配置提取出來,在簡化POM的同時還可以促進各個模塊配置的一致性。
聚合
? ? ? 我們在一個項目中會存在模塊A和模塊B,在各自的項目目錄下,我們可以分別通過命令 mvn clean package 來構建各個模塊,但是如果我們想將這兩個模塊一起構建呢?
? ? ? ?答案是我們需要建立一個模塊C做為一個聚合模塊。
如下圖(兩個圖一起看)所示:
從圖中可以看出,passport是各個passport-xx的聚合模塊,聚合模塊也是一個模塊,所以同樣會有POM文件,其重要的的pom配置如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.baidu</groupId><artifactId>company</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging><modules><module>company-agent</module><module>company-java-core</module><module>company-https</module><module>company-http</module><module>company-management</module><module>company-security</module><module>company-login</module><module>company-sns</module><module>company-mt</module><module>company-message-scribe2mysql-storm</module><module>company-activator</module><module>company-activator-api</module><module>company-recard</module><module>company-zk-replicator</module><module>company-app-auth</module><module>company-app-auth-https</module><module>company-app-auth-applier</module><module>company-user-rights</module><module>company-idc</module></modules> </project>在配置中(此處將passport和company互換了下,為了不泄露公司數據,希望大家可以看懂即可),我們需要注意以下的標簽:
<packaging>pom</packaging>
在前面的學習中,我們見過打包方式為jar和war的,但是聚合模塊的打包方式必須為pom,否則無法完成構建。
在company聚合模塊的目錄下,我們執行 mvn clean package,結果如下:
[INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] company [INFO] company-swift-common [INFO] company-db-aio-common [INFO] company-agent [INFO] company-security [INFO] company-captcha [INFO] company-core [INFO] company-sns [INFO] company-request-check [INFO] company-captcha-voice [INFO] company-https [INFO] company-http [INFO] company-management [INFO] company app auth https [INFO] company-app-auth-applier [INFO] company-user-rights [INFO] company-idc [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building company 0.0.1-SNAPSHOT可以看到maven給根據各個模塊之間的依賴關系,給我們計算好了構建次序(也叫反應堆),接下來將會依次構建各個模塊,實現了一條命令構建多個模塊。
?
繼承
? ? ? ? 繼承和聚合有相似的地方,繼承的特性是指建立一個父模塊,我們項目中的多個模塊都做為該模塊的子模塊,將各個子模塊相同的依賴和插件配置提取出來,從而簡化配置文件,父模塊的打包方式必須為pom,否則無法構建項目。父模塊和聚合模塊經常可以做到合二為一。
? ? ? ? 通過在各個子模塊中配置來表明其繼承與哪一個父模塊:
<parent><groupId>com.baidu</groupId><artifactId>miliao-rootpom</artifactId> <version>2.0.3</version> </parent>可繼承的POM元素如下:
- groupId:項目組ID,項目坐標的核心元素
- version:項目版本,項目坐標的核心因素
- description:項目的描述信息
- organization:項目的組織信息
- inceptionYear:項目的創始年份
- url:項目的URL地址
- developers:項目的開發者信息
- contributors:項目的貢獻者信息
- distributionManagement:項目的部署配置
- issueManagement:項目的缺陷跟蹤系統信息
- ciManagement:項目的持續集成系統信息
- scm:項目的版本控制系統
- malilingLists:項目的郵件列表信息
- properties:自定義的Maven屬性
- dependencies:項目的依賴配置
- dependencyManagement:項目的依賴管理配置
- repositories:項目的倉庫配置
- build:包括項目的源碼目錄配置、輸出目錄配置、插件配置、插件管理配置等
- reporting:包括項目的報告輸出目錄配置、報告插件配置等
聚合和繼承的關系
? ? ? ?雖然聚合模塊和父模塊經常合二為一,但是聚合和繼承是兩個不同的概念,其實是沒有什么關系的。
聚合模塊知道它聚合了哪些模塊,但是被聚合的模塊不知道聚合模塊的存在;
父模塊不知道子模塊的存在,但是子模塊都必須知道自己的父模塊是誰。
可以用下圖來表示這兩個不同的概念:
?
反應堆
? ? ? ? 在一個擁有多個模塊的Maven項目中,反應堆(Reactor)是指所有模塊組成的一個構建結構。對于單個模塊的項目來說反應堆就是該模塊本身,但是對于多模塊的項目來說,反應堆就包含了各個模塊之間的繼承與依賴的關系,最后再根據各個模塊在pom中聲明的先后順序,自動計算出合理的模塊構建順序。
在company聚合模塊的目錄下,我們執行 mvn clean package,在結果的前面就顯示了構建順序(反應堆):
[INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] company [INFO] company-swift-common [INFO] company-db-aio-common [INFO] company-agent [INFO] company-security [INFO] company-captcha [INFO] company-core [INFO] company-sns [INFO] company-request-check [INFO] company-captcha-voice [INFO] company-https [INFO] company-http [INFO] company-management [INFO] company app auth https [INFO] company-app-auth-applier [INFO] company-user-rights [INFO] company-idc [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building company 0.0.1-SNAPSHOT裁剪反應堆
? ? ? 我們可以通過如下的命令來裁剪反應堆:
比如,我們可以在聚合模塊的路徑下執行:
- mvn clean package -pl commpany-test,company-agent? ?表示我們指定要構建這兩個模塊。
- mvn clean package -pl commpany-test? -am 表示我們要構建commpany-test,同時要構建該模塊依賴的其余模塊。
? ? ? ? 這個裁剪反應堆還是很有作用的,比如我們有一個模塊company-A,在該模塊中我們依賴company-B模塊并且version為0.0.2,如果我們單獨構建company-A,那么將會從maven倉庫(本地+遠程)中去下載version為0.0.2的company-B,若該模塊不存在,構建過程將報錯。假如我們使用了 -am 參數,那么即使倉庫中不存在version為0.0.2的company-B, maven將會自動從當前項目中打包構建version為0.0.2的company-B,前提是company-B的pom配置中version為0.0.2,這樣company-A的構建過程將不會出錯。
?
總結
? ? ? 通過本文的介紹,我們學習了Maven的聚合與繼承特性,可以更加方便的管理和構建項目了。到此,通過五節課的學習,我們基本完成了Maven的常見知識點的介紹與學習,學會這些基本可以讓我們在日常的工作中愉快構建項目了。接下來便是更加高深的Maven用法了,有興趣的同學可以和博主一起學習。
?
如果對你有幫助,記得點贊哦~歡迎大家關注我的博客,可以進群366533258一起交流學習哦~
本群給大家提供一個學習交流的平臺,內設菜鳥Java管理員一枚、精通算法的金牌講師一枚、Android管理員一枚、藍牙BlueTooth管理員一枚、Web前端管理一枚以及C#管理一枚。歡迎大家進來交流技術。
關注微信公眾號(文強的技術小屋),學習更多技術知識,一起遨游知識海洋~
總結
以上是生活随笔為你收集整理的Maven的聚合与继承的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 货物配送问题的matlab,遗传算法ma
- 下一篇: 分布式存储 HDFS原理