Maven分模塊開(kāi)發(fā)與依賴(lài)管理和聚合和繼承及屬性深入詳細(xì)介紹
前言
對(duì)于復(fù)雜龐大的項(xiàng)目,maven的熟練使用可以大大提高工作效率
分模塊開(kāi)發(fā)
開(kāi)發(fā)的模塊可以獨(dú)立出來(lái),作為一個(gè)資源,當(dāng)需要使用時(shí)可以通過(guò)依賴(lài)的形式來(lái)引用
1.1 分模塊開(kāi)發(fā)理念
將原始模塊按照功能拆分成若干個(gè)子模塊,方便模塊間的相互調(diào)用,接口共享。這樣的話(huà),項(xiàng)目中的每一層都可以單獨(dú)維護(hù),也可以很方便的被別人使用
1.按照功能拆分
為了避免項(xiàng)目中某一個(gè)模塊代碼出現(xiàn)問(wèn)題,導(dǎo)致整個(gè)項(xiàng)目無(wú)法正常啟動(dòng),我們會(huì)按照功能將項(xiàng)目進(jìn)行拆分
2.按照模塊拆分
為了提高代碼復(fù)用性
可以將公共的部分抽取成一個(gè)獨(dú)立的模塊,其他模塊要想使用可以像添加第三方j(luò)ar包依賴(lài)一樣來(lái)使用我們自己抽取的模塊,這樣就解決了代碼重復(fù)的問(wèn)題(比如訂單用戶(hù))
1.2 分模塊開(kāi)發(fā)實(shí)現(xiàn)
建立依賴(lài)關(guān)系
在maven01
項(xiàng)目的pom.xml添加maven03
的依賴(lài)
<dependency> <groupId>ppgoodlike.yu7daily</groupId> <artifactId>maven03</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
在IDEA中是有maven03
這個(gè)項(xiàng)目,所以我們只需要將maven03
項(xiàng)目安裝到本地倉(cāng)庫(kù)即可,將需要被依賴(lài)的項(xiàng)目maven03
,使用maven的install命令,把其安裝到Maven的本地倉(cāng)庫(kù)中。否則會(huì)出現(xiàn)編譯錯(cuò)誤!
2.依賴(lài)管理
2.1 依賴(lài)傳遞與沖突問(wèn)題
(1) A依賴(lài)了B和C,B和C有分別依賴(lài)了其他jar包,所以在A項(xiàng)目中就可以使用上面所有jar包,這就是所謂的依賴(lài)傳遞
(2) 依賴(lài)傳遞有直接依賴(lài)和間接依賴(lài)
直接依賴(lài):在當(dāng)前項(xiàng)目中通過(guò)依賴(lài)配置建立的依賴(lài)關(guān)系
間接依賴(lài):被資源的資源如果依賴(lài)其他資源,當(dāng)前項(xiàng)目間接依賴(lài)其他資源
- 相對(duì)于A來(lái)說(shuō),A直接依賴(lài)B和C,間接依賴(lài)了D1,E1,G,F(xiàn),D2和E2
- 相對(duì)于B來(lái)說(shuō),B直接依賴(lài)了D1和E1,間接依賴(lài)了G
- 直接依賴(lài)和間接依賴(lài)是一個(gè)相對(duì)的概念
(3)因?yàn)橛幸蕾?lài)傳遞的存在,就會(huì)導(dǎo)致jar包在依賴(lài)的過(guò)程中出現(xiàn)沖突問(wèn)題,具體什么是沖突?Maven是如何解決沖突的?
這里所說(shuō)的依賴(lài)沖突是指項(xiàng)目依賴(lài)的某一個(gè)jar包,有多個(gè)不同的版本,因而造成類(lèi)包版本沖突。
情況一: 在maven01
的pom.xml中添加兩個(gè)不同版本的Junit依賴(lài):
<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> </dependencies>
特殊優(yōu)先:當(dāng)同級(jí)配置了相同資源的不同版本,后配置的覆蓋先配置的。
情況二:
路徑優(yōu)先:當(dāng)依賴(lài)中出現(xiàn)相同的資源時(shí),層級(jí)越深,優(yōu)先級(jí)越低,層級(jí)越淺,優(yōu)先級(jí)越高
- A通過(guò)B間接依賴(lài)到E1
- A通過(guò)C間接依賴(lài)到E2
- A就會(huì)間接依賴(lài)到E1和E2,Maven會(huì)按照層級(jí)來(lái)選擇,E1是2度,E2是3度,所以最終會(huì)選擇E1
情況三:
聲明優(yōu)先:當(dāng)資源在相同層級(jí)被依賴(lài)時(shí),配置順序靠前的覆蓋配置順序靠后的
- A通過(guò)B間接依賴(lài)到D1
- A通過(guò)C間接依賴(lài)到D2
- D1和D2都是兩度,這個(gè)時(shí)候就不能按照層級(jí)來(lái)選擇,需要按照聲明來(lái),誰(shuí)先聲明用誰(shuí),也就是說(shuō)B在C之前聲明,這個(gè)時(shí)候使用的是D1,反之則為D2
2.2 可選依賴(lài)和排除依賴(lài)
為了解決依賴(lài)的版本沖突問(wèn)題,通??梢噪[藏對(duì)外的資源關(guān)系
方案一:可選依賴(lài)
可選依賴(lài)指對(duì)外隱藏當(dāng)前所依賴(lài)的資源—不透明
在maven04
的pom.xml,在引入maven03
的時(shí)候,添加optional
<dependency> <groupId>ppgoodlike.yu7daily</groupId> <artifactId>maven03</artifactId> <version>1.0-SNAPSHOT</version> <!--可選依賴(lài)是隱藏當(dāng)前工程所依賴(lài)的資源,隱藏后對(duì)應(yīng)資源將不具有依賴(lài)傳遞--> <optional>true</optional> </dependency>
方案二:排除依賴(lài)
排除依賴(lài)指主動(dòng)斷開(kāi)依賴(lài)的資源,被排除的資源無(wú)需指定版本—不需要
前面我們已經(jīng)通過(guò)可選依賴(lài)實(shí)現(xiàn)了阻斷maven03的依賴(lài)傳遞,對(duì)于排除依賴(lài),則指的是已經(jīng)有依賴(lài)的事實(shí),也就是說(shuō)maven01項(xiàng)目中已經(jīng)通過(guò)依賴(lài)傳遞用到了maven03,此時(shí)我們需要做的是將其進(jìn)行排除,所以接下來(lái)需要修改maven01的pom.xml
<dependency> <groupId>ppgoodlike.yu7daily</groupId> <artifactId>maven04</artifactId> <version>1.0-SNAPSHOT</version> <!--排除依賴(lài)是隱藏當(dāng)前資源對(duì)應(yīng)的依賴(lài)關(guān)系--> <exclusions> <exclusion> <groupId>ppgoodlike.yu7daily</groupId> <artifactId>maven03</artifactId> </exclusion> </exclusions> </dependency>
- A依賴(lài)B,B依賴(lài)C,
C
通過(guò)依賴(lài)傳遞會(huì)被A
使用到,現(xiàn)在要想辦法讓A
不去依賴(lài)C
- 可選依賴(lài)是在B上設(shè)置
<optional>
,A
不知道有C
的存在, - 排除依賴(lài)是在A上設(shè)置
<exclusions>
,A
知道有C
的存在,主動(dòng)將其排除掉。
3.聚合和繼承
3.1 聚合
1.所謂聚合:將多個(gè)模塊組織成一個(gè)整體,同時(shí)進(jìn)行項(xiàng)目構(gòu)建的過(guò)程稱(chēng)為聚合
2.聚合工程:通常是一個(gè)不具有業(yè)務(wù)功能的"空"工程(有且僅有一個(gè)pom文件)
使用聚合工程可以將多個(gè)工程編組,通過(guò)對(duì)聚合工程進(jìn)行構(gòu)建,實(shí)現(xiàn)對(duì)所包含的模塊進(jìn)行同步構(gòu)建
當(dāng)工程中某個(gè)模塊發(fā)生更新(變更)時(shí),必須保障工程中與已更新模塊關(guān)聯(lián)的模塊同步更新,此時(shí)可以使用聚合工程來(lái)解決批量模塊同步構(gòu)建的問(wèn)題。
聚合具體的實(shí)現(xiàn)步驟為:
<?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>ppgoodlike.yu7daily</groupId> <artifactId>maven01</artifactId> <version>1.0-RELEASE</version> <packaging>pom</packaging> <!--設(shè)置管理的模塊名稱(chēng)--> <modules> <module>../maven01</module> <module>../maven03</module> <module>../maven04</module> </modules> </project>
測(cè)試發(fā)現(xiàn),當(dāng)maven01
的compile
被點(diǎn)擊后,所有被其管理的項(xiàng)目都會(huì)被執(zhí)行編譯操作。這就是聚合工程的作用。
聚合工程管理的項(xiàng)目在進(jìn)行運(yùn)行的時(shí)候,會(huì)按照項(xiàng)目與項(xiàng)目之間的依賴(lài)關(guān)系來(lái)自動(dòng)決定執(zhí)行的順序和配置的順序無(wú)關(guān)。
最后總結(jié)一句話(huà)就是,聚合工程主要是用來(lái)管理項(xiàng)目。
3.2 繼承
所謂繼承:描述的是兩個(gè)工程間的關(guān)系,與java中的繼承相似,子工程可以繼承父工程中的配置信息,常見(jiàn)于依賴(lài)關(guān)系的繼承
將所有項(xiàng)目公共的jar包依賴(lài)提取到父工程的pom.xml中,子項(xiàng)目就可以不用重復(fù)編寫(xiě),簡(jiǎn)化開(kāi)發(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包的地方對(duì)應(yīng)的版本會(huì)自動(dòng)隨之更新
最后總結(jié)一句話(huà)就是,父工程主要是用來(lái)快速配置依賴(lài)jar包和管理項(xiàng)目中所使用的資源。
實(shí)現(xiàn)步驟:
1.創(chuàng)建Maven模塊,設(shè)置打包類(lèi)型為pom
<packaging>pom</packaging>
2.在父工程的pom文件中配置依賴(lài)關(guān)系(子工程將沿用父工程中的依賴(lài)關(guān)系),一般只抽取子項(xiàng)目中公有的jar包
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.10.RELEASE</version> </dependency> ... </dependencies>
3.在父工程中配置子工程中可選的依賴(lài)關(guān)系
<dependencyManagement> <dependencies> <dependency> <groupId>ppgoodlike.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency> </dependencies> ... </dependencyManagement>
4.在子工程中配置當(dāng)前工程所繼承的父工程
<!--定義該工程的父工程--> <parent> <groupId>ppgoodlike.yu7daily</groupId> <artifactId>maven01</artifactId> <version>1.0-RELEASE</version> <!--填寫(xiě)父工程的pom文件,可以不寫(xiě)--> <relativePath>../maven01/pom.xml</relativePath> </parent>
5.在子工程中配置使用父工程中可選依賴(lài)的坐標(biāo)
<dependencies> <dependency> <groupId>ppgoodlike.alibaba</groupId> <artifactId>druid</artifactId> </dependency> </dependencies>
注意事項(xiàng):
1.子工程中使用父工程中的可選依賴(lài)時(shí),僅需要提供群組id和項(xiàng)目id,無(wú)需提供版本,版本由父工程統(tǒng)一提供,避免版本沖突
2.子工程中還可以定義父工程中沒(méi)有定義的依賴(lài)關(guān)系,只不過(guò)不能被父工程進(jìn)行版本統(tǒng)一管理。
3.3 聚合VS繼承
兩種之間的作用:
- 聚合用于快速構(gòu)建項(xiàng)目,對(duì)項(xiàng)目進(jìn)行管理
- 繼承用于快速配置和管理子項(xiàng)目中所使用jar包的版本
聚合和繼承的相同點(diǎn):
- 聚合與繼承的pom.xml文件打包方式均為pom,可以將兩種關(guān)系制作到同一個(gè)pom文件中
- 聚合與繼承均屬于設(shè)計(jì)型模塊,并無(wú)實(shí)際的模塊內(nèi)容
聚合和繼承的不同點(diǎn):
- 聚合是在當(dāng)前模塊中配置關(guān)系,聚合可以感知到參與聚合的模塊有哪些
- 繼承是在子模塊中配置關(guān)系,父模塊無(wú)法感知哪些子模塊繼承了自己
4.屬性
為了解決更新多個(gè)jar包的版本,而出現(xiàn)漏改導(dǎo)致程序出問(wèn)題,可以聲明一個(gè)變量,在其他地方使用該變量,當(dāng)變量的值發(fā)生變化后,所有使用變量的地方,就會(huì)跟著修改,以spring、junit、mybatis-spring為例
4.1 定義父工程屬性
<properties> <spring.version>5.2.10.RELEASE</spring.version> <junit.version>4.12</junit.version> <mybatis-spring.version>1.3.0</mybatis-spring.version> </properties>
4.2 修改依賴(lài)的version
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency>
5.配置文件加載屬性
為了讓maven管理范圍更大,我們可以在父工程中定義屬性通過(guò)配置文件引用的方式來(lái)完成配置
5.1 父工程定義屬性
<properties> <jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url> </properties>
5.2 jdbc.properties文件中引用屬性
在jdbc.properties,將jdbc.url的值直接獲取Maven配置的屬性
jdbc.driver=ppgoodlike.mysql.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.username=root
jdbc.password=284650
5.3 設(shè)置maven過(guò)濾文件范圍
Maven在默認(rèn)情況下是從當(dāng)前項(xiàng)目的src\main\resources
下讀取文件進(jìn)行打包?,F(xiàn)在我們需要打包的資源文件是在maven01下,需要我們通過(guò)配置來(lái)指定下具體的資源目錄
<build> <resources> <!--設(shè)置資源目錄--> <resource> <directory>../maven01/src/main/resources</directory> <!--設(shè)置能夠解析${},默認(rèn)是false --> <filtering>true</filtering> </resource> </resources> </build>
directory路徑前要添加../
的原因是maven01相對(duì)于父工程的pom.xml路徑是在其上一層的目錄中,所以需要添加。
到此這篇關(guān)于Maven分模塊開(kāi)發(fā)與依賴(lài)管理和聚合和繼承及屬性深入詳細(xì)介紹的文章就介紹到這了,更多相關(guān)Maven分模塊開(kāi)發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot項(xiàng)目啟動(dòng)時(shí)如何讀取配置以及初始化資源
這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目啟動(dòng)時(shí)如何讀取配置以及初始化資源的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Mybatis-plus使用TableNameHandler分表詳解(附完整示例源碼)
這篇文章主要介紹了Mybatis-plus使用TableNameHandler分表詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Vue實(shí)現(xiàn)驗(yàn)證碼登錄的超詳細(xì)步驟
這篇文章主要給大家介紹了關(guān)于Vue實(shí)現(xiàn)驗(yàn)證碼登錄的超詳細(xì)步驟,我們?cè)谑褂胿ue進(jìn)行前端開(kāi)發(fā)時(shí)都需要登錄驗(yàn)證,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09基于Java編寫(xiě)一個(gè)簡(jiǎn)單的風(fēng)控組件
這篇文章主要為大家詳細(xì)介紹了如何基于Java編寫(xiě)一個(gè)簡(jiǎn)單的風(fēng)控組件,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下2022-12-12java并發(fā)編程專(zhuān)題(三)----詳解線(xiàn)程的同步
這篇文章主要介紹了JAVA并發(fā)編程 線(xiàn)程同步的的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06idea?compile項(xiàng)目正常啟動(dòng)項(xiàng)目的時(shí)候build失敗報(bào)“找不到符號(hào)”等問(wèn)題及解決方案
這篇文章主要介紹了idea?compile項(xiàng)目正常,啟動(dòng)項(xiàng)目的時(shí)候build失敗,報(bào)“找不到符號(hào)”等問(wèn)題,這種問(wèn)題屬于lombok編譯失敗導(dǎo)致,可能原因是依賴(lài)jar包沒(méi)有更新到最新版本,需要的朋友可以參考下2023-10-10java 中的static關(guān)鍵字和final關(guān)鍵字的不同之處
java 中的static關(guān)鍵字和final關(guān)鍵字的不同之處,需要的朋友可以參考一下2013-03-03Mybatis 如何批量刪除數(shù)據(jù)的實(shí)現(xiàn)示例
這篇文章主要介紹了Mybatis 如何批量刪除數(shù)據(jù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03