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

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

步驟2:將項目的打包方式改為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>
**說明:**項目的打包方式,我們接觸到的有三種,分別是
- jar:默認情況,說明該項目為java項目
- war:說明該項目為web項目
- pom:說明該項目為聚合或繼承(后面會講)項目
步驟3: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>
<!--設置管理的模塊名稱-->
<modules>
<module>../maven_02_ssm</module>
<module>../maven_03_pojo</module>
<module>../maven_04_dao</module>
</modules>
</project>
步驟4:使用聚合統一管理項目

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

spring-webmvc、spring-jdbc在三個項目模塊中都有出現,這樣就出現了重復的內容spring-test只在ssm_crm和ssm_goods中出現,而在ssm_order中沒有,這里是部分重復的內容- 我們使用的spring版本目前是
5.2.10.RELEASE,假如后期要想升級spring版本,所有跟Spring相關jar包都得被修改,涉及到的項目越多,維護成本越高
面對上面的這些問題,我們就得用到接下來要學習的繼承
所謂繼承:描述的是兩個工程間的關系,與java中的繼承相似,子工程可以繼承父工程中的配置信息,常見于依賴關系的繼承。
作用:
- 簡化配置
- 減少版本沖突
接下來,我們到程序中去看看繼承該如何實現?
步驟1:創(chuàng)建一個空的Maven項目并將其打包方式設置為pom
因為這一步和前面maven創(chuàng)建聚合工程的方式是一摸一樣,所以我們可以單獨創(chuàng)建一個新的工程,也可以直接和聚合公用一個工程。實際開發(fā)中,聚合和繼承一般也都放在同一個項目中,但是這兩個的功能是不一樣的。
步驟2:在子項目中設置其父工程
分別在maven_02_ssm,maven_03_pojo,maven_04_dao的pom.xml中添加其父項目為maven_01_parent
<!--配置當前工程繼承自parent工程-->
<parent>
<groupId>com.itheima</groupId>
<artifactId>maven_01_parent</artifactId>
<version>1.0-RELEASE</version>
<!--設置父項目pom.xml位置路徑-->
<relativePath>../maven_01_parent/pom.xml</relativePath>
</parent>
步驟3:優(yōu)化子項目共有依賴導入問題
將子項目共同使用的jar包都抽取出來,維護在父項目的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>
<!--設置管理的模塊名稱-->
<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>
刪除子項目中已經被抽取到父項目的pom.xml中的jar包,如在maven_02_ssm的pom.xml中將已經出現在父項目的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>
<!--配置當前工程繼承自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>
<!--排除依賴是隱藏當前資源對應的依賴關系-->
<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ā)現父項目中有依賴對應的jar包,子項目雖然已經將重復的依賴刪除掉了,但是刷新的時候,子項目中所需要的jar包依然存在。
當項目的<parent>標簽被移除掉,會發(fā)現多出來的jar包依賴也會隨之消失。
- 將
maven_04_dao項目的pom.xml中的所有依賴刪除,然后添加上maven_01_parent的父項目坐標
<?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>
<!--配置當前工程繼承自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ā)現maven_04_dao同樣引入了父項目中的所有依賴。

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

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

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

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

創(chuàng)建成功后,maven_parent即是聚合工程又是父工程,maven_web中也有parent標簽,繼承的就是maven_parent,對于難以配置的內容都自動生成。
按照上面這種方式,大家就可以根據自己的需要來構建分模塊項目。
到此這篇關于Maven高級的聚合和繼承的文章就介紹到這了,更多相關Maven高級的聚合和繼承內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
springboot處理url中帶斜杠/\字符的參數報400問題
這篇文章主要介紹了springboot處理url中帶斜杠/\字符的參數報400問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
MyBatis-Plus中的LambdaQuery用法實例詳解
LambdaQueryWrapper是MyBatis-Plus的類型安全查詢工具,通過Lambda表達式簡化條件構建,避免硬編碼字段名,提升代碼可讀性、維護性及重構友好性,適用于單表查詢場景,本文給大家介紹MyBatis-Plus中的LambdaQuery用法,感興趣的朋友一起看看吧2025-07-07
一次由Lombok的@AllArgsConstructor注解引發(fā)的錯誤及解決
這篇文章主要介紹了一次由Lombok的@AllArgsConstructor注解引發(fā)的錯誤及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09

