Maven繼承與聚合詳解及作用介紹
一、繼承
引言
繼承關(guān)系可以對(duì)不同模塊的依賴版本做統(tǒng)一管理,因?yàn)樽幽K中的依賴基本都繼承于父模塊,父模塊中指定哪個(gè)版本,子模塊就繼承哪個(gè)版本,可以有效避免不同模塊可能采用不同版本的依賴時(shí)產(chǎn)生的沖突
1. 繼承關(guān)系的實(shí)現(xiàn)
(1)parent 模塊設(shè)置
parent 模塊即父模塊,由于父模塊只是為了給子模塊提供依賴,所以父模塊中只需要一個(gè) pom.xml 文件即可。父模塊的打包方式必須設(shè)置為 pom(默認(rèn)打包方式是 jar)
<groupId>com.mzz</groupId>
<artifactId>parent-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 設(shè)置打包方式為 pom -->
<packaging>pom</packaging>
只要設(shè)置了 packaging 屬性為 pom,這個(gè)模塊就可以作為 parent 模塊被繼承了
(2)子模塊設(shè)置
子模塊中只要設(shè)置了 parent 標(biāo)簽,就可以建立繼承關(guān)系。
所以繼承主要體現(xiàn)在子模塊,parent 模塊是感受不到繼承關(guān)系的,也無法從 parent 模塊中看出哪些模塊繼承了自己。
另外繼承關(guān)系建議以后,如果子模塊與父模塊處于同一 groupId 下,那么子模塊可以不寫 groupId
<!--<groupId>com.mzz</groupId>-->
<artifactId>project-dao</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<!-- parent 模塊的坐標(biāo)與版本 -->
<groupId>com.mzz</groupId>
<artifactId>parent-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- parent 模塊的相對(duì)路徑 -->
<relativePath>../parent-maven/pom.xml</relativePath>
</parent>對(duì) relativePath 屬性做一些補(bǔ)充:
- relativePath 可以省略,前提是 parent 模塊已經(jīng) install 至倉庫,否則子模塊無法定位到 parent,不能通過編譯
- 相對(duì)路徑最后可以不寫 pom.xml,只定位到父模塊的文件夾也可以
2. 依賴配置
(1)必須繼承的依賴
parent 模塊中聲明的依賴便是子模塊必須繼承的依賴,子模塊中不必聲明便從父模塊中繼承了這些依賴
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.20.RELEASE</version> </dependency> <!-- 省略了其他依賴的聲明 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> <!-- scope 屬性也會(huì)被繼承 --> </dependency> <dependencies>

如上圖,可見子模塊中未聲明依賴就繼承了 parent 中的所有依賴
(2)有選擇地繼承依賴
parent 模塊中設(shè)置依賴管理 dependencyManagement 后,在其中聲明的依賴就是供子模塊選擇的依賴。子模塊需要哪些依賴,必須在子模塊中聲明依賴,但不需要注明 version,因?yàn)榘姹居?parent 來指定。
<!-- parent 模塊 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.10.RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 子模塊聲明依賴 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
</dependencies>
如果子模塊聲明的依賴有 version 屬性,那么這個(gè)依賴并不繼承自 parent
另外,parent 模塊聲明在 dependencyManagement 中的依賴并不被 parent 模塊所依賴
(3)插件繼承
插件的繼承規(guī)則和設(shè)置方法與前面的依賴極為相似,同樣也有插件管理 pluginManagement,與 dependencyManagement 類似,這里給出一個(gè) parent 中設(shè)置的樣例模板
<build>
<plugins>
<!-- 聲明必須繼承的插件 -->
</plugins>
<pluginManagement>
<plugins>
<!-- 聲明可供選擇是否繼承的插件 -->
</plugins>
</pluginManagement>
</build>
二、聚合
引言
聚合就是指將多個(gè)模塊組織成一個(gè)整體,同時(shí)進(jìn)行項(xiàng)目的構(gòu)建工作。
使用聚合可以避免分模塊開發(fā)時(shí)的一些問題,比如某個(gè)模塊更新了一些內(nèi)容,但其它已經(jīng)構(gòu)建好的模塊不會(huì)進(jìn)行更新,將所有模塊聚合之后,只對(duì)聚合模塊進(jìn)行構(gòu)建就會(huì)對(duì)所有模塊都進(jìn)行構(gòu)建,能夠及時(shí)的發(fā)現(xiàn)問題
實(shí)現(xiàn)聚合
聚合模塊也被稱為 root 模塊,同樣是一個(gè)只需要 pom.xml 文件的項(xiàng)目,只要設(shè)置了 modules 標(biāo)簽,再將聚合的模塊添加進(jìn)去,即可實(shí)現(xiàn)聚合
<modules> <!-- module 屬性中寫明被聚合模塊的相對(duì)路徑 --> <module>../project-pojo</module> <module>../project-dao</module> <module>../project-service</module> </modules>
如上例,將 pojo,dao 和 service 三個(gè)模塊進(jìn)行了聚合,只要對(duì)聚合模塊進(jìn)行構(gòu)建,這三個(gè)模塊也會(huì)被一起構(gòu)建
聚合只體現(xiàn)在聚合模塊,被聚合的模塊也無法感知自身被誰所聚合
三、繼承與聚合的合并
繼承是的 parent 模塊和聚合時(shí)的 root 模塊都只有 pom.xml,因?yàn)樗麄兌际窃O(shè)計(jì)型模塊,不包含實(shí)際的模塊內(nèi)容。事實(shí)上,繼承與聚合經(jīng)常被合并在一起使用,父模塊(parent)也作為聚合模塊(root)使用,只需要在父模塊中加入 modules 屬性,將子模塊聚合即可
這時(shí)要說一說繼承時(shí)說到的 relativePath 屬性,前面說 relativePath 屬性可以省略,前提是父模塊已經(jīng)構(gòu)建并 install 至倉庫,否則子模塊無法構(gòu)建,但此時(shí)父模塊同時(shí)也聚合了子模塊,要構(gòu)建父模塊就又要一起構(gòu)建子模塊,但構(gòu)建子模塊又需要父模塊 install 至倉庫……陷入了套娃問題
此時(shí)構(gòu)建父模塊 maven 會(huì)報(bào)錯(cuò): Non-resolvable parent POM for XXX.XXX.XXX Could not find artifact com.mzz:parent-maven:pom:1.0-SNAPSHOT and ‘parent.relativePath’ points at wrong local POM,原因是無法定位 parent 模塊
解決方法也很簡單,要么老老實(shí)實(shí)在子模塊中 parent 標(biāo)簽中加入 relativePath 屬性,使 maven
可以根據(jù)相對(duì)路徑找到父模塊,要么,先將父模塊中的 modules 注釋掉,暫時(shí)不做聚合,將父模塊 install 之后再取消注釋,然后就能一起構(gòu)建啦
到此這篇關(guān)于Maven繼承與聚合詳解及作用介紹的文章就介紹到這了,更多相關(guān)Maven 繼承 聚合內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java在運(yùn)行時(shí)識(shí)別類型信息的方法詳解
這篇文章主要給大家介紹了關(guān)于Java在運(yùn)行時(shí)識(shí)別類型信息的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考借鑒,下面來一起看看吧2019-01-01
Spring整合Quartz Job以及Spring Task的實(shí)現(xiàn)方法
下面小編就為大家分享一篇Spring整合Quartz Job以及Spring Task的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12
SpringBoot實(shí)現(xiàn)讀取YML,yaml,properties文件
yml,yaml,properties三種文件都是用來存放配置的文件,一些靜態(tài)數(shù)據(jù),配置的數(shù)據(jù)都會(huì)存放到里邊。本文主要為大家整理了SpringBoot實(shí)現(xiàn)讀取YML,yaml,properties文件的方法,需要的可以參考一下2023-04-04
Java之Rsync并發(fā)遷移數(shù)據(jù)并校驗(yàn)詳解
這篇文章主要介紹了Java之Rsync并發(fā)遷移數(shù)據(jù)并校驗(yàn)詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
spring?boot入門之誕生背景及優(yōu)勢(shì)影響
這篇文章主要為大家描述說明了介紹了spring?boot誕生的背景以及其產(chǎn)生的優(yōu)勢(shì)影響,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
Spring Security 強(qiáng)制退出指定用戶的方法
本篇文章主要介紹了Spring Security 強(qiáng)制退出指定用戶的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
json-lib將json格式的字符串,轉(zhuǎn)化為java對(duì)象的實(shí)例
下面小編就為大家?guī)硪黄猨son-lib將json格式的字符串,轉(zhuǎn)化為java對(duì)象的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03

