Maven高級的聚合和繼承的實(shí)現(xiàn)
聚合和繼承
我們的項(xiàng)目已經(jīng)從以前的單模塊,變成了現(xiàn)在的多模塊開發(fā)。項(xiàng)目一旦變成了多模塊開發(fā)以后,就會引發(fā)一些問題,在這一節(jié)中我們主要會學(xué)習(xí)兩個(gè)內(nèi)容聚合和繼承,用這兩個(gè)知識來解決下分模塊后的一些問題。
1 聚合

- 分模塊開發(fā)后,需要將這四個(gè)項(xiàng)目都安裝到本地倉庫,目前我們只能通過項(xiàng)目Maven面板的
install來安裝,并且需要安裝四個(gè),如果我們的項(xiàng)目足夠多,那么一個(gè)個(gè)安裝起來還是比較麻煩的 - 如果四個(gè)項(xiàng)目都已經(jīng)安裝成功,當(dāng)ssm_pojo發(fā)生變化后,我們就得將ssm_pojo重新安裝到maven倉庫,但是為了確保我們對ssm_pojo的修改不會影響到其他項(xiàng)目模塊,我們需要對所有的模塊進(jìn)行重新編譯,那又需要將所有的模塊再來一遍
項(xiàng)目少的話還好,但是如果項(xiàng)目多的話,一個(gè)個(gè)操作項(xiàng)目就容易出現(xiàn)漏掉或重復(fù)操作的問題,所以我們就想能不能抽取一個(gè)項(xiàng)目,把所有的項(xiàng)目管理起來,以后我們要想操作這些項(xiàng)目,只需要操作這一個(gè)項(xiàng)目,其他所有的項(xiàng)目都走一樣的流程,這個(gè)不就很省事省力。
這就用到了我們接下來要講解的聚合,
- 所謂聚合:將多個(gè)模塊組織成一個(gè)整體,同時(shí)進(jìn)行項(xiàng)目構(gòu)建的過程稱為聚合
- 聚合工程:通常是一個(gè)不具有業(yè)務(wù)功能的"空"工程(有且僅有一個(gè)pom文件)
- 作用:使用聚合工程可以將多個(gè)工程編組,通過對聚合工程進(jìn)行構(gòu)建,實(shí)現(xiàn)對所包含的模塊進(jìn)行同步構(gòu)建
- 當(dāng)工程中某個(gè)模塊發(fā)生更新(變更)時(shí),必須保障工程中與已更新模塊關(guān)聯(lián)的模塊同步更新,此時(shí)可以使用聚合工程來解決批量模塊同步構(gòu)建的問題。
關(guān)于聚合具體的實(shí)現(xiàn)步驟為:
步驟1:創(chuàng)建一個(gè)空的maven項(xiàng)目

步驟2:將項(xiàng)目的打包方式改為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.itheima</groupId>
<artifactId>maven_01_parent</artifactId>
<version>1.0-RELEASE</version>
<packaging>pom</packaging>
</project>
**說明:**項(xiàng)目的打包方式,我們接觸到的有三種,分別是
- jar:默認(rèn)情況,說明該項(xiàng)目為java項(xiàng)目
- war:說明該項(xiàng)目為web項(xiàng)目
- pom:說明該項(xiàng)目為聚合或繼承(后面會講)項(xiàng)目
步驟3:pom.xml添加所要管理的項(xiàng)目
<?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.itheima</groupId>
<artifactId>maven_01_parent</artifactId>
<version>1.0-RELEASE</version>
<packaging>pom</packaging>
<!--設(shè)置管理的模塊名稱-->
<modules>
<module>../maven_02_ssm</module>
<module>../maven_03_pojo</module>
<module>../maven_04_dao</module>
</modules>
</project>
步驟4:使用聚合統(tǒng)一管理項(xiàng)目

測試發(fā)現(xiàn),當(dāng)maven_01_parent的compile被點(diǎn)擊后,所有被其管理的項(xiàng)目都會被執(zhí)行編譯操作。這就是聚合工程的作用。
**說明:**聚合工程管理的項(xiàng)目在進(jìn)行運(yùn)行的時(shí)候,會按照項(xiàng)目與項(xiàng)目之間的依賴關(guān)系來自動決定執(zhí)行的順序和配置的順序無關(guān)。
聚合的知識我們就講解完了,最后總結(jié)一句話就是,聚合工程主要是用來管理項(xiàng)目。
2 繼承
我們已經(jīng)完成了使用聚合工程去管理項(xiàng)目,聚合工程進(jìn)行某一個(gè)構(gòu)建操作,其他被其管理的項(xiàng)目也會執(zhí)行相同的構(gòu)建操作。那么接下來,我們再來分析下,多模塊開發(fā)存在的另外一個(gè)問題,重復(fù)配置的問題,我們先來看張圖:

spring-webmvc、spring-jdbc在三個(gè)項(xiàng)目模塊中都有出現(xiàn),這樣就出現(xiàn)了重復(fù)的內(nèi)容spring-test只在ssm_crm和ssm_goods中出現(xiàn),而在ssm_order中沒有,這里是部分重復(fù)的內(nèi)容- 我們使用的spring版本目前是
5.2.10.RELEASE,假如后期要想升級spring版本,所有跟Spring相關(guān)jar包都得被修改,涉及到的項(xiàng)目越多,維護(hù)成本越高
面對上面的這些問題,我們就得用到接下來要學(xué)習(xí)的繼承
所謂繼承:描述的是兩個(gè)工程間的關(guān)系,與java中的繼承相似,子工程可以繼承父工程中的配置信息,常見于依賴關(guān)系的繼承。
作用:
- 簡化配置
- 減少版本沖突
接下來,我們到程序中去看看繼承該如何實(shí)現(xiàn)?
步驟1:創(chuàng)建一個(gè)空的Maven項(xiàng)目并將其打包方式設(shè)置為pom
因?yàn)檫@一步和前面maven創(chuàng)建聚合工程的方式是一摸一樣,所以我們可以單獨(dú)創(chuàng)建一個(gè)新的工程,也可以直接和聚合公用一個(gè)工程。實(shí)際開發(fā)中,聚合和繼承一般也都放在同一個(gè)項(xiàng)目中,但是這兩個(gè)的功能是不一樣的。
步驟2:在子項(xiàng)目中設(shè)置其父工程
分別在maven_02_ssm,maven_03_pojo,maven_04_dao的pom.xml中添加其父項(xiàng)目為maven_01_parent
<!--配置當(dāng)前工程繼承自parent工程-->
<parent>
<groupId>com.itheima</groupId>
<artifactId>maven_01_parent</artifactId>
<version>1.0-RELEASE</version>
<!--設(shè)置父項(xiàng)目pom.xml位置路徑-->
<relativePath>../maven_01_parent/pom.xml</relativePath>
</parent>
步驟3:優(yōu)化子項(xiàng)目共有依賴導(dǎo)入問題
將子項(xiàng)目共同使用的jar包都抽取出來,維護(hù)在父項(xiàng)目的pom.xml中
<?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.itheima</groupId>
<artifactId>maven_01_parent</artifactId>
<version>1.0-RELEASE</version>
<packaging>pom</packaging>
<!--設(shè)置管理的模塊名稱-->
<modules>
<module>../maven_02_ssm</module>
<module>../maven_03_pojo</module>
<module>../maven_04_dao</module>
</modules>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
</project>
刪除子項(xiàng)目中已經(jīng)被抽取到父項(xiàng)目的pom.xml中的jar包,如在maven_02_ssm的pom.xml中將已經(jīng)出現(xiàn)在父項(xiàng)目的jar包刪除掉
<?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.itheima</groupId>
<artifactId>maven_02_ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<!--配置當(dāng)前工程繼承自parent工程-->
<parent>
<groupId>com.itheima</groupId>
<artifactId>maven_01_parent</artifactId>
<version>1.0-RELEASE</version>
<relativePath>../maven_01_parent/pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven_04_dao</artifactId>
<version>1.0-SNAPSHOT</version>
<!--排除依賴是隱藏當(dāng)前資源對應(yīng)的依賴關(guān)系-->
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
刪除完后,你會發(fā)現(xiàn)父項(xiàng)目中有依賴對應(yīng)的jar包,子項(xiàng)目雖然已經(jīng)將重復(fù)的依賴刪除掉了,但是刷新的時(shí)候,子項(xiàng)目中所需要的jar包依然存在。
當(dāng)項(xiàng)目的<parent>標(biāo)簽被移除掉,會發(fā)現(xiàn)多出來的jar包依賴也會隨之消失。
- 將
maven_04_dao項(xiàng)目的pom.xml中的所有依賴刪除,然后添加上maven_01_parent的父項(xiàng)目坐標(biāo)
<?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.itheima</groupId>
<artifactId>maven_04_dao</artifactId>
<version>1.0-SNAPSHOT</version>
<!--配置當(dāng)前工程繼承自parent工程-->
<parent>
<groupId>com.itheima</groupId>
<artifactId>maven_01_parent</artifactId>
<version>1.0-RELEASE</version>
<relativePath>../maven_01_parent/pom.xml</relativePath>
</parent>
</project>
刷新并查看Maven的面板,會發(fā)現(xiàn)maven_04_dao同樣引入了父項(xiàng)目中的所有依賴。

這樣我們就可以解決剛才提到的第一個(gè)問題,將子項(xiàng)目中的公共jar包抽取到父工程中進(jìn)行統(tǒng)一添加依賴,這樣做的可以簡化配置,并且當(dāng)父工程中所依賴的jar包版本發(fā)生變化,所有子項(xiàng)目中對應(yīng)的jar包版本也會跟著更新。

步驟4:優(yōu)化子項(xiàng)目依賴版本問題
如果把所有用到的jar包都管理在父項(xiàng)目的pom.xml,看上去更簡單些,但是這樣就會導(dǎo)致有很多項(xiàng)目引入了過多自己不需要的jar包。如上面看到的這張圖:

如果把所有的依賴都放在了父工程中進(jìn)行統(tǒng)一維護(hù),就會導(dǎo)致ssm_order項(xiàng)目中多引入了spring-test的jar包,如果這樣的jar包過多的話,對于ssm_order來說也是一種"負(fù)擔(dān)"。
那針對于這種部分項(xiàng)目有的jar包,我們該如何管理優(yōu)化呢?
- 在父工程mavne_01_parent的pom.xml來定義依賴管理
<!--定義依賴管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 將maven_02_ssm的pom.xml中的junit依賴刪除掉,刷新Maven

刷新完會發(fā)現(xiàn),在maven_02_ssm項(xiàng)目中的junit依賴并沒有出現(xiàn),所以我們得到一個(gè)結(jié)論:
<dependencyManagement>標(biāo)簽不真正引入jar包,而是配置可供子項(xiàng)目選擇的jar包依賴
子項(xiàng)目要想使用它所提供的這些jar包,需要自己添加依賴,并且不需要指定<version>
- 在maven_02_ssm的pom.xml添加junit的依賴
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
注意:這里就不需要添加版本了,這樣做的好處就是當(dāng)父工程dependencyManagement標(biāo)簽中的版本發(fā)生變化后,子項(xiàng)目中的依賴版本也會跟著發(fā)生變化
- 在maven_04_dao的pom.xml添加junit的依賴
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
這個(gè)時(shí)候,maven_02_ssm和maven_04_dao這兩個(gè)項(xiàng)目中的junit版本就會跟隨著父項(xiàng)目中的標(biāo)簽dependencyManagement中junit的版本發(fā)生變化而變化。不需要junit的項(xiàng)目就不需要添加對應(yīng)的依賴即可。
至此繼承就已經(jīng)學(xué)習(xí)完了,總結(jié)來說,繼承可以幫助做兩件事
- 將所有項(xiàng)目公共的jar包依賴提取到父工程的pom.xml中,子項(xiàng)目就可以不用重復(fù)編寫,簡化開發(fā)
- 將所有項(xiàng)目的jar包配置到父工程的dependencyManagement標(biāo)簽下,實(shí)現(xiàn)版本管理,方便維護(hù)
- dependencyManagement標(biāo)簽不真正引入jar包,只是管理jar包的版本
- 子項(xiàng)目在引入的時(shí)候,只需要指定groupId和artifactId,不需要加version
- 當(dāng)dependencyManagement標(biāo)簽中jar包版本發(fā)生變化,所有子項(xiàng)目中有用到該jar包的地方對應(yīng)的版本會自動隨之更新
最后總結(jié)一句話就是,父工程主要是用來快速配置依賴jar包和管理項(xiàng)目中所使用的資源。
小結(jié)
繼承的實(shí)現(xiàn)步驟:
創(chuàng)建Maven模塊,設(shè)置打包類型為pom
<packaging>pom</packaging>
在父工程的pom文件中配置依賴關(guān)系(子工程將沿用父工程中的依賴關(guān)系),一般只抽取子項(xiàng)目中公有的jar包
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
...
</dependencies>
在父工程中配置子工程中可選的依賴關(guān)系
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
</dependencies>
...
</dependencyManagement>
在子工程中配置當(dāng)前工程所繼承的父工程
<!--定義該工程的父工程-->
<parent>
<groupId>com.itheima</groupId>
<artifactId>maven_01_parent</artifactId>
<version>1.0-RELEASE</version>
<!--填寫父工程的pom文件,可以不寫-->
<relativePath>../maven_01_parent/pom.xml</relativePath>
</parent>
在子工程中配置使用父工程中可選依賴的坐標(biāo)
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
</dependencies>
注意事項(xiàng):
1.子工程中使用父工程中的可選依賴時(shí),僅需要提供群組id和項(xiàng)目id,無需提供版本,版本由父工程統(tǒng)一提供,避免版本沖突
2.子工程中還可以定義父工程中沒有定義的依賴關(guān)系,只不過不能被父工程進(jìn)行版本統(tǒng)一管理。
3 聚合與繼承的區(qū)別
3.1 聚合與繼承的區(qū)別
兩種之間的作用:
- 聚合用于快速構(gòu)建項(xiàng)目,對項(xiàng)目進(jìn)行管理
- 繼承用于快速配置和管理子項(xiàng)目中所使用jar包的版本
聚合和繼承的相同點(diǎn):
- 聚合與繼承的pom.xml文件打包方式均為pom,可以將兩種關(guān)系制作到同一個(gè)pom文件中
- 聚合與繼承均屬于設(shè)計(jì)型模塊,并無實(shí)際的模塊內(nèi)容
聚合和繼承的不同點(diǎn):
- 聚合是在當(dāng)前模塊中配置關(guān)系,聚合可以感知到參與聚合的模塊有哪些
- 繼承是在子模塊中配置關(guān)系,父模塊無法感知哪些子模塊繼承了自己
相信到這里,大家已經(jīng)能區(qū)分開什么是聚合和繼承,但是有一個(gè)稍微麻煩的地方就是聚合和繼承的工程構(gòu)建,需要在聚合項(xiàng)目中手動添加modules標(biāo)簽,需要在所有的子項(xiàng)目中添加parent標(biāo)簽,萬一寫錯(cuò)了咋辦?
3.2 IDEA構(gòu)建聚合與繼承工程
其實(shí)對于聚合和繼承工程的創(chuàng)建,IDEA已經(jīng)能幫助我們快速構(gòu)建,具體的實(shí)現(xiàn)步驟為:
步驟1:創(chuàng)建一個(gè)Maven項(xiàng)目
創(chuàng)建一個(gè)空的Maven項(xiàng)目,可以將項(xiàng)目中的src目錄刪除掉,這個(gè)項(xiàng)目作為聚合工程和父工程。

步驟2:創(chuàng)建子項(xiàng)目
該項(xiàng)目可以被聚合工程管理,同時(shí)會繼承父工程。

創(chuàng)建成功后,maven_parent即是聚合工程又是父工程,maven_web中也有parent標(biāo)簽,繼承的就是maven_parent,對于難以配置的內(nèi)容都自動生成。
按照上面這種方式,大家就可以根據(jù)自己的需要來構(gòu)建分模塊項(xiàng)目。
到此這篇關(guān)于Maven高級的聚合和繼承的文章就介紹到這了,更多相關(guān)Maven高級的聚合和繼承內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java基于quasar實(shí)現(xiàn)協(xié)程池的方法示例
本文主要介紹了java基于quasar實(shí)現(xiàn)協(xié)程池的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>2022-06-06
SpringMVC的處理器適配器-HandlerAdapter的用法及說明
這篇文章主要介紹了SpringMVC的處理器適配器-HandlerAdapter的用法及說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
Springboot使用filter對response內(nèi)容進(jìn)行加密方式
這篇文章主要介紹了Springboot使用filter對response內(nèi)容進(jìn)行加密方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03

