Maven高級的聚合和繼承的實(shí)現(xiàn)
聚合和繼承
我們的項(xiàng)目已經(jīng)從以前的單模塊,變成了現(xiàn)在的多模塊開發(fā)。項(xiàng)目一旦變成了多模塊開發(fā)以后,就會引發(fā)一些問題,在這一節(jié)中我們主要會學(xué)習(xí)兩個內(nèi)容聚合
和繼承
,用這兩個知識來解決下分模塊后的一些問題。
1 聚合
- 分模塊開發(fā)后,需要將這四個項(xiàng)目都安裝到本地倉庫,目前我們只能通過項(xiàng)目Maven面板的
install
來安裝,并且需要安裝四個,如果我們的項(xiàng)目足夠多,那么一個個安裝起來還是比較麻煩的 - 如果四個項(xiàng)目都已經(jīng)安裝成功,當(dāng)ssm_pojo發(fā)生變化后,我們就得將ssm_pojo重新安裝到maven倉庫,但是為了確保我們對ssm_pojo的修改不會影響到其他項(xiàng)目模塊,我們需要對所有的模塊進(jìn)行重新編譯,那又需要將所有的模塊再來一遍
項(xiàng)目少的話還好,但是如果項(xiàng)目多的話,一個個操作項(xiàng)目就容易出現(xiàn)漏掉或重復(fù)操作的問題,所以我們就想能不能抽取一個項(xiàng)目,把所有的項(xiàng)目管理起來,以后我們要想操作這些項(xiàng)目,只需要操作這一個項(xiàng)目,其他所有的項(xiàng)目都走一樣的流程,這個不就很省事省力。
這就用到了我們接下來要講解的聚合,
- 所謂聚合:將多個模塊組織成一個整體,同時進(jìn)行項(xiàng)目構(gòu)建的過程稱為聚合
- 聚合工程:通常是一個不具有業(yè)務(wù)功能的"空"工程(有且僅有一個pom文件)
- 作用:使用聚合工程可以將多個工程編組,通過對聚合工程進(jìn)行構(gòu)建,實(shí)現(xiàn)對所包含的模塊進(jìn)行同步構(gòu)建
- 當(dāng)工程中某個模塊發(fā)生更新(變更)時,必須保障工程中與已更新模塊關(guān)聯(lián)的模塊同步更新,此時可以使用聚合工程來解決批量模塊同步構(gòu)建的問題。
關(guān)于聚合具體的實(shí)現(xiàn)步驟為:
步驟1:創(chuàng)建一個空的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)行的時候,會按照項(xiàng)目與項(xiàng)目之間的依賴關(guān)系來自動決定執(zhí)行的順序和配置的順序無關(guān)。
聚合的知識我們就講解完了,最后總結(jié)一句話就是,聚合工程主要是用來管理項(xiàng)目。
2 繼承
我們已經(jīng)完成了使用聚合工程去管理項(xiàng)目,聚合工程進(jìn)行某一個構(gòu)建操作,其他被其管理的項(xiàng)目也會執(zhí)行相同的構(gòu)建操作。那么接下來,我們再來分析下,多模塊開發(fā)存在的另外一個問題,重復(fù)配置
的問題,我們先來看張圖:
spring-webmvc
、spring-jdbc
在三個項(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í)的繼承
所謂繼承:描述的是兩個工程間的關(guān)系,與java中的繼承相似,子工程可以繼承父工程中的配置信息,常見于依賴關(guān)系的繼承。
作用:
- 簡化配置
- 減少版本沖突
接下來,我們到程序中去看看繼承該如何實(shí)現(xiàn)?
步驟1:創(chuàng)建一個空的Maven項(xiàng)目并將其打包方式設(shè)置為pom
因?yàn)檫@一步和前面maven創(chuàng)建聚合工程的方式是一摸一樣,所以我們可以單獨(dú)創(chuàng)建一個新的工程,也可以直接和聚合公用一個工程。實(shí)際開發(fā)中,聚合和繼承一般也都放在同一個項(xiàng)目中,但是這兩個的功能是不一樣的。
步驟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ù)的依賴刪除掉了,但是刷新的時候,子項(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)目中的所有依賴。
這樣我們就可以解決剛才提到的第一個問題,將子項(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),所以我們得到一個結(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>
這個時候,maven_02_ssm和maven_04_dao這兩個項(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)目在引入的時候,只需要指定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.子工程中使用父工程中的可選依賴時,僅需要提供群組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)系制作到同一個pom文件中
- 聚合與繼承均屬于設(shè)計型模塊,并無實(shí)際的模塊內(nèi)容
聚合和繼承的不同點(diǎn):
- 聚合是在當(dāng)前模塊中配置關(guān)系,聚合可以感知到參與聚合的模塊有哪些
- 繼承是在子模塊中配置關(guān)系,父模塊無法感知哪些子模塊繼承了自己
相信到這里,大家已經(jīng)能區(qū)分開什么是聚合和繼承,但是有一個稍微麻煩的地方就是聚合和繼承的工程構(gòu)建,需要在聚合項(xiàng)目中手動添加modules
標(biāo)簽,需要在所有的子項(xiàng)目中添加parent
標(biāo)簽,萬一寫錯了咋辦?
3.2 IDEA構(gòu)建聚合與繼承工程
其實(shí)對于聚合和繼承工程的創(chuàng)建,IDEA已經(jīng)能幫助我們快速構(gòu)建,具體的實(shí)現(xiàn)步驟為:
步驟1:創(chuàng)建一個Maven項(xiàng)目
創(chuàng)建一個空的Maven項(xiàng)目,可以將項(xiàng)目中的src
目錄刪除掉,這個項(xiàng)目作為聚合工程和父工程。
步驟2:創(chuàng)建子項(xiàng)目
該項(xiàng)目可以被聚合工程管理,同時會繼承父工程。
創(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í)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>2022-06-06SpringMVC的處理器適配器-HandlerAdapter的用法及說明
這篇文章主要介紹了SpringMVC的處理器適配器-HandlerAdapter的用法及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12Springboot使用filter對response內(nèi)容進(jìn)行加密方式
這篇文章主要介紹了Springboot使用filter對response內(nèi)容進(jìn)行加密方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03