Maven dependencyManagement元素標(biāo)簽的具體使用
我們知道,子模塊可以通過(guò)繼承獲得父模塊中聲明的全部依賴(lài),這樣雖然避免了在各個(gè)子模塊 POM 中重復(fù)進(jìn)行依賴(lài)聲明,但也極有可能造成子模塊中引入一些不必要的依賴(lài)。為此 Maven 引入了 dependencyManagement 來(lái)對(duì)依賴(lài)進(jìn)行管理。
依賴(lài)管理
Maven 可以通過(guò) dependencyManagement 元素對(duì)依賴(lài)進(jìn)行管理,它具有以下 2 大特性:
- 在該元素下聲明的依賴(lài)不會(huì)實(shí)際引入到模塊中,只有在 dependencies 元素下同樣聲明了該依賴(lài),才會(huì)引入到模塊中。
- 該元素能夠約束 dependencies 下依賴(lài)的使用,即 dependencies 聲明的依賴(lài)若未指定版本,則使用 dependencyManagement 中指定的版本,否則將覆蓋 dependencyManagement 中的版本。
例如,修改 App-Data-lib 模塊的 pom.xml 如下。
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--由于不是繼承,所以必須重新添加 groupId 和 version-->
<groupId>org.example</groupId>
<artifactId>App-Data-lib</artifactId>
<version>1.0</version>
<!--dependencyManagement 標(biāo)簽用于控制子模塊的依賴(lài)版本等信息 -->
<!-- 該標(biāo)簽只用來(lái)控制版本,不能將依賴(lài)引入 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<!--引用的properties標(biāo)簽中定義的屬性 -->
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--引用的properties標(biāo)簽中定義的屬性 -->
<version>4.9</version>
<!-- <scope>test</scope> -->
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--引用的properties標(biāo)簽中定義的屬性 -->
<version>5.1.18</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<!--引用的properties標(biāo)簽中定義的屬性 -->
<version>0.9.1</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--聲明依賴(lài)-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
</project>
在以上配置中,由于 dependencyManagement 元素中已經(jīng)定義完整的依賴(lài)聲明,所以在 dependencies 元素中聲明的依賴(lài)只配置了 groupId 和 artifactId,省略了 version 和 scope。
在實(shí)際的開(kāi)發(fā)過(guò)程中,dependencyManagement 很少會(huì)單獨(dú)使用,通常它需要與 Maven 繼承或依賴(lài)范圍 import 配合使用才能展現(xiàn)它的優(yōu)勢(shì)。
繼承依賴(lài)管理
由于 dependencyManagement 元素是可以被繼承的,因此我們可以在父模塊 POM 中使用 dependencyManagement 元素聲明所有子模塊的依賴(lài),然后在各個(gè)子模塊 POM 使用 dependencies 元素聲明實(shí)際用到的依賴(lài)即可。這樣既可以讓子模塊能夠繼承父模塊的依賴(lài)配置,還能避免將不必要的依賴(lài)引入到子模塊中。
1. 修改父模塊 Root 的 pom.xml 如下。
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>Root</artifactId>
<version>1.0</version>
<!--定義的父類(lèi)pom.xml 打包類(lèi)型使pom -->
<packaging>pom</packaging>
<properties>
<!-- 定義一些 maven 變量 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<log4j.version>1.2.17</log4j.version>
<junit.version>4.9</junit.version>
<system.version>1.0</system.version>
<mysql.connector.version>5.1.18</mysql.connector.version>
<c3p0.version>0.9.1</c3p0.version>
</properties>
<!--dependencyManagement 標(biāo)簽用于控制子模塊的依賴(lài)版本等信息 -->
<!-- 該標(biāo)簽只用來(lái)控制版本,不能將依賴(lài)引入 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<!--引用的properties標(biāo)簽中定義的變量 -->
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--引用的properties標(biāo)簽中定義的變量 -->
<version>${junit.version}</version>
<!-- <scope>test</scope> -->
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--引用的properties標(biāo)簽中定義的變量 -->
<version>${mysql.connector.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<!--引用的properties標(biāo)簽中定義的變量 -->
<version>${c3p0.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
注:以上配置中,將所有依賴(lài)的版本信息以 Maven 變量(properties)的形式提取出來(lái),這樣不僅消除了一些重復(fù),也使得各個(gè)依賴(lài)的版本信息更加明顯,便于管理。
在父模塊 Root 中使用 dependencyManagement 元素聲明的依賴(lài),既不會(huì)給 Root 模塊引入依賴(lài),也不會(huì)給其子模塊引入依賴(lài),但這段配置是可以被繼承的。
2. 修改子模塊 App-Core-lib 的 pom.xml 如下。
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>App-Core-lib</artifactId>
<parent>
<groupId>org.example</groupId>
<artifactId>Root</artifactId>
<version>1.0</version>
<relativePath>../Root</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
</dependency>
</dependencies>
<distributionManagement>
<repository>
<id>bianchengbang_Release_hosted</id>
<url>http://localhost:8082/nexus/content/repositories/bianchengbang_Release_hosted/</url>
</repository>
<snapshotRepository>
<id>Snapshot</id>
<url>http://localhost:8082/nexus/content/repositories/bianchengbang_Snapshot_hosted/</url>
</snapshotRepository>
</distributionManagement>
</project>
在子模塊 App-Core-lib 和 App-Data-lib 的 POM 中,所有在 dependencies 元素中聲明的依賴(lài)都只配置了 groupId 和 artifactId,省去了 version 和 scope。之所以能夠省略這些信息,是因?yàn)樗鼈兝^承了父模塊 Root 中 dependencyManagement 的配置,其完整的依賴(lài)聲明已經(jīng)包含在父模塊的 POM 中,子模塊只需要配置 groupId 和 artifactId 就能獲得相應(yīng)的依賴(lài)信息,從而引入正確的依賴(lài)。
使用這種依賴(lài)管理機(jī)制似乎并不能減少太多 POM 配置,但我們?nèi)匀煌扑]使用這種方式,其原因主要有 2 個(gè):
-在父模塊中使用 dependencyManagement 聲明依賴(lài)能夠統(tǒng)一項(xiàng)目?jī)?nèi)依賴(lài)的版本,子模塊無(wú)須聲明版本,也就不會(huì)出現(xiàn)多個(gè)子模塊使用同一依賴(lài)項(xiàng)版本不一致的情況,降低依賴(lài)沖突的幾率。
- dependencyManagement 聲明的依賴(lài)不會(huì)被實(shí)際引入,子模塊需要什么依賴(lài)就自己引入,增加了靈活性,避免引入一些不必要的依賴(lài)。
導(dǎo)入依賴(lài)管理
因?yàn)?import 依賴(lài)范圍只能與 dependencyManagement 元素配合使用才會(huì)有效,其功能是將目標(biāo) pom.xml 中的 dependencyManagement 配置導(dǎo)入合并到當(dāng)前 pom.xml 的 dependencyManagement 中。
例如,App-Data-lib 模塊想要使用 Root 模塊中的 dependencyManagement 配置,除了通過(guò)繼承或者直接復(fù)制這兩種方式之外,還可以使用 import 依賴(lài)范圍將其導(dǎo)入,具體配置如下。
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--由于不是繼承,所以必須重新添加 groupId 和 version-->
<groupId>org.example</groupId>
<artifactId>App-Data-lib</artifactId>
<version>1.0</version>
<!--定義依賴(lài)管理-->
<dependencyManagement>
<dependencies>
<!--導(dǎo)入依賴(lài)管理配置-->
<dependency>
<groupId>org.example</groupId>
<artifactId>Root</artifactId>
<version>1.0</version>
<!--依賴(lài)范圍為 import-->
<scope>import</scope>
<!--類(lèi)型一般為pom-->
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<!--聲明依賴(lài)-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
</project>
以上配置中,由于 import 依賴(lài)范圍的特殊性,一般都是指向打包類(lèi)型為 pom 的模塊,所以 type 元素的值一般為 pom。
若存在多個(gè)模塊,它們使用的依賴(lài)版本都是一致的,則就可以定義一個(gè)使用 dependencyManagement 專(zhuān)門(mén)管理依賴(lài)的 POM,然后在各個(gè)模塊中導(dǎo)入這些依賴(lài)管理配置。
到此這篇關(guān)于Maven dependencyManagement元素標(biāo)簽的具體使用的文章就介紹到這了,更多相關(guān)Maven dependencyManagement內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Maven dependency:tree 的 8 個(gè)高級(jí)用法
- Maven中的dependencyManagement 實(shí)例詳解
- Maven dependency中的scope案例講解
- Maven中dependencyManagement管理項(xiàng)目依賴(lài)項(xiàng)
- Maven?dependency?plugin使用心得總結(jié)
- Maven中dependency和plugins的繼承與約束
- Maven dependencies與dependencyManagement的區(qū)別詳解
- Maven中dependency標(biāo)簽參數(shù)的使用小結(jié)
相關(guān)文章
Java使用poi-tl設(shè)置word圖片環(huán)繞方式為浮于在文字上方
POI-TL 是一個(gè)基于 Apache POI 的 Java 庫(kù),專(zhuān)注于在 Microsoft Word 文檔(.docx 格式)中進(jìn)行模板填充和動(dòng)態(tài)內(nèi)容生成,下面我們看看如何使用poi-tl設(shè)置word圖片環(huán)繞方式為浮于在文字上方吧2025-03-03
Java常用類(lèi)之System類(lèi)的使用指南
System類(lèi)代表系統(tǒng),系統(tǒng)級(jí)的很多屬性和控制方法都放置在該類(lèi)的內(nèi)部。該類(lèi)位于java.lang包。本文將通過(guò)示例為大家詳細(xì)講講System類(lèi)的使用,需要的可以參考一下2022-07-07
springMVC 用戶(hù)登錄權(quán)限驗(yàn)證實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了springMVC 用戶(hù)登錄權(quán)限驗(yàn)證實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
springboot JPA?CriteriaBuilder?如何獲取指定字段
這篇文章主要介紹了springboot JPA CriteriaBuilder如何獲取指定字段,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
java開(kāi)發(fā)BeanUtils類(lèi)解決實(shí)體對(duì)象間賦值
這篇文章主要為大家介紹了java開(kāi)發(fā)中使用BeanUtils類(lèi)實(shí)現(xiàn)實(shí)體對(duì)象之間的賦值有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步學(xué)有所得2021-10-10
springboot如何解決跨域后session獲取不到sessionId不一致
這篇文章主要介紹了springboot如何解決跨域后session獲取不到sessionId不一致問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法
這篇文章主要介紹了Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08

