Maven的使用之繼承與聚合
一、實(shí)驗:繼承
1、概念
Maven工程之間,A 工程繼承 B 工程
B 工程:父工程
A 工程:子工程
本質(zhì)上是 A 工程的 pom.xml 中的配置繼承了 B 工程中 pom.xml 的配置。
2、作用
在父工程中統(tǒng)一管理項目中的依賴信息,具體來說是管理依賴信息的版本。
它的背景是:
對一個比較大型的項目進(jìn)行了模塊拆分。 一個 project 下面,創(chuàng)建了很多個 module。 每一個 module都需要配置自己的依賴信息。
它背后的需求是:
? 在每一個 module 中各自維護(hù)各自的依賴信息很容易發(fā)生出入,不易統(tǒng)一管理。
? 使用同一個框架內(nèi)的不同 jar包,它們應(yīng)該是同一個版本,所以整個項目中使用的框架版本需要統(tǒng)一。? 使用框架時所需要的 jar包組合(或者說依賴信息組合)需要經(jīng)過長期摸索和反復(fù)調(diào)試,最終確定一個可用組合。這個耗費(fèi)很大精力總結(jié)出來的方案不應(yīng)該在新的項目中重新摸索。
通過在父工程中為整個項目維護(hù)依賴信息的組合既保證了整個項目使用規(guī)范、準(zhǔn)確的 jar 包;又能夠?qū)⒁酝慕?jīng)驗沉淀下來,節(jié)約時間和精力。
3、舉例
在一個工程中依賴多個 Spring 的 jar 包
TIP
使用
Spring
時要求所有Spring
自己的jar
包版本必須一致。為了能夠?qū)@些jar
包的版本進(jìn)行統(tǒng)一管理,我們使用繼承這個機(jī)制,將所有版本信息統(tǒng)一在父工程中進(jìn)行管理。
4、操作
4.1 創(chuàng)建父工程
創(chuàng)建的過程和前面創(chuàng)建
pro01-maven-java
一樣。
工程名稱:pro03-maven-parent
工程創(chuàng)建好之后,要修改它的打包方式:
<groupId>com.atguigu.maven</groupId> <artifactId>pro03-maven-parent</artifactId> <version>1.0-SNAPSHOT</version> <!-- 當(dāng)前工程作為父工程,它要去管理子工程,所以打包方式必須是 pom --> <packaging>pom</packaging>
只有打包方式為
pom
的Maven
工程能夠管理其他Maven
工程。打包方式為pom
的Maven
工程中不寫業(yè)務(wù)代碼,它是專門管理其他Maven
工程的工程
4.2 創(chuàng)建模塊工程
模塊工程類似于
IDEA
中的module
,所以需要進(jìn)入pro03-maven-parent
工程的根目錄,然后運(yùn)行mvn archetype:generate
命令來創(chuàng)建模塊工程。
假設(shè),我們創(chuàng)建三個模塊工程:
4.3 查看被添加新內(nèi)容的父工程 pom.xml
下面 modules
和 module
標(biāo)簽是聚合功能的配置
<modules> <module>pro04-maven-module</module> <module>pro05-maven-module</module> <module>pro06-maven-module</module> </modules>
4.4 解讀子工程的pom.xml
<!-- 使用parent標(biāo)簽指定當(dāng)前工程的父工程 --> <parent> <!-- 父工程的坐標(biāo) --> <groupId>com.atguigu.maven</groupId> <artifactId>pro03-maven-parent</artifactId> <version>1.0-SNAPSHOT</version> </parent> <!-- 子工程的坐標(biāo) --> <!-- 如果子工程坐標(biāo)中的groupId和version與父工程一致,那么可以省略 --> <!-- <groupId>com.atguigu.maven</groupId> --> <artifactId>pro04-maven-module</artifactId> <!-- <version>1.0-SNAPSHOT</version> -->
4.5 在父工程中配置依賴的統(tǒng)一管理
<!-- 使用dependencyManagement標(biāo)簽配置對依賴的管理 --> <!-- 被管理的依賴并沒有真正被引入到工程 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>4.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.0.0.RELEASE</version> </dependency> </dependencies> </dependencyManagement>
4.6 子工程中引用那些被父工程管理的依賴
關(guān)鍵點(diǎn):省略版本號
<!-- 子工程引用父工程中的依賴信息時,可以把版本號去掉。 --> <!-- 把版本號去掉就表示子工程中這個依賴的版本由父工程決定。 --> <!-- 具體來說是由父工程的dependencyManagement來決定。 --> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> </dependency> </dependencies>
4.7 在父工程中升級依賴信息的版本
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.1.4.RELEASE</version> </dependency>
然后在子工程中運(yùn)行mvn dependency:list
,效果如下:
TIP
4.8 在父工程中聲明自定義屬性
<!-- 通過自定義屬性,統(tǒng)一指定Spring的版本 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 自定義標(biāo)簽,維護(hù)Spring版本數(shù)據(jù) --> <atguigu.spring.version>4.3.6.RELEASE</atguigu.spring.version> </properties>
在需要的地方使用${}的形式來引用自定義的屬性名:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${atguigu.spring.version}</version> </dependency>
真正實(shí)現(xiàn)“一處修改,處處生效”。
5、實(shí)際意義
編寫一套符合要求、開發(fā)各種功能都能正常工作的依賴組合并不容易。如果公司里已經(jīng)有人總結(jié)了成熟的組合方案,那么再開發(fā)新項目時,如果不使用原有的積累,而是重新摸索,會浪費(fèi)大量的時間。為了提高效率,我們可以使用工程繼承的機(jī)制,讓成熟的依賴組合方案能夠保留下來。
如上圖所示,公司級的父工程中管理的就是成熟的依賴組合方案,各個新項目、子系統(tǒng)各取所需即可。
二、實(shí)驗:聚合
1、聚合本身的含義
部分組成整體
動畫片《戰(zhàn)神金剛》中的經(jīng)典臺詞:“我來組成頭部!我來組成手臂!”就是聚合關(guān)系最生動的體現(xiàn)。
2、Maven 中的聚合
使用一個“總工程”將各個“模塊工程”匯集起來,作為一個整體對應(yīng)完整的項目。
? 項目:整體
? 模塊:部分
概念的對應(yīng)關(guān)系:
? 從繼承關(guān)系角度來看:
父工程 子工程
? 從聚合關(guān)系角度來看:
總工程 模塊工程
3、好處
? 一鍵執(zhí)行 Maven 命令:很多構(gòu)建命令都可以在“總工程”中一鍵執(zhí)行。
以 mvn install 命令為例:Maven要求有父工程時先安裝父工程;有依賴的工程時,先安裝被依賴的工程。我們自己考慮這些規(guī)則會很麻煩。但是工程聚合之后,在總工程執(zhí)行 mvn install 可以一鍵完成安裝,而且會自動按照正確的順序執(zhí)行。
? 配置聚合之后,各個模塊工程會在總工程中展示一個列表,讓項目中的各個模塊一目了然。
4、聚合的配置
在總工程中配置 modules 即可:
<modules> <module>pro04-maven-module</module> <module>pro05-maven-module</module> <module>pro06-maven-module</module> </modules>
5、依賴循環(huán)問題
如果 A 工程依賴 B 工程,B 工程依賴 C 工程,C 工程又反過來依賴 A 工程,那么在執(zhí)行構(gòu)建操作時會報下面的錯誤:
[ERROR] [ERROR] The projects in the reactor contain a cyclic reference:
這個錯誤的含義是:循環(huán)引用。
以上就是Maven的使用之繼承與聚合的詳細(xì)內(nèi)容,更多關(guān)于Maven繼承與聚合的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式
這篇文章主要介紹了Mybatis中<if>和<choose>的區(qū)別及“=”判斷方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06FastJson實(shí)現(xiàn)駝峰下劃線相互轉(zhuǎn)換方法詳解
這篇文章主要介紹了使用FastJson進(jìn)行駝峰下劃線相互轉(zhuǎn)換寫法及誤區(qū),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01使用Servlet Filter實(shí)現(xiàn)系統(tǒng)登錄權(quán)限
這篇文章主要為大家詳細(xì)介紹了使用Servlet Filter實(shí)現(xiàn)系統(tǒng)登錄權(quán)限,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-10-10