Maven中的<scope>元素使用解讀
Maven的<scope>元素
概述
在 Maven 中,<scope> 元素用于控制依賴(lài)項(xiàng)的作用范圍和生命周期,即定義依賴(lài)項(xiàng)在項(xiàng)目的編譯、測(cè)試、運(yùn)行等階段的可見(jiàn)性,以及是否會(huì)被打包到最終產(chǎn)物中。
正確使用 <scope> 可以幫助我們優(yōu)化項(xiàng)目的構(gòu)建過(guò)程,減少不必要的依賴(lài)沖突,并提高構(gòu)建效率。
常見(jiàn)的<scope>取值及其含義
| scope | 作用范圍 | 場(chǎng)景示例 |
|---|---|---|
| compile | 默認(rèn)值。覆蓋編譯(compile)、測(cè)試(test)、運(yùn)行(runtime)所有階段,依賴(lài)會(huì)被直接包含到項(xiàng)目的 classpath 中,且會(huì)隨著項(xiàng)目打包(如 JAR/WAR)一起發(fā)布。 | 大多數(shù)業(yè)務(wù)依賴(lài)(如 Spring、Jackson 等)默認(rèn)使用此范圍 |
| provided | 僅在編譯(compile)和測(cè)試(test)階段有效,運(yùn)行(runtime)階段由外部環(huán)境(如應(yīng)用服務(wù)器)提供依賴(lài),依賴(lài)不會(huì)被打包到項(xiàng)目產(chǎn)物中(因?yàn)檫\(yùn)行時(shí)由外部提供)。 | 容器提供的依賴(lài):Servlet API(如 javax.servlet:javax.servlet-api) |
| runtime | 在測(cè)試(test)和運(yùn)行(runtime)階段有效,編譯(compile)階段不可用。 | JDBC 驅(qū)動(dòng)(如 mysql:mysql-connector-java) |
| test | 僅在測(cè)試(test)階段有效(包括測(cè)試代碼的編譯和運(yùn)行),依賴(lài)不會(huì)被打包到最終產(chǎn)物中,也不會(huì)影響主代碼的運(yùn)行。 | 測(cè)試框架(如 JUnit、Mockito) |
| system | 與 provided 類(lèi)似(僅編譯和測(cè)試階段有效),但依賴(lài)需要顯式指定本地文件路徑(非 Maven 倉(cāng)庫(kù)),通過(guò) <systemPath> 手動(dòng)指定依賴(lài)的本地路徑。 | 不推薦使用,Maven 3.0 后已標(biāo)記為過(guò)時(shí),建議改用 provided 或自定義倉(cāng)庫(kù) |
| import | 在 <dependencyManagement> 中使用。僅用于導(dǎo)入其他 POM 的 <dependencyManagement> 依賴(lài)配置,不會(huì)實(shí)際添加依賴(lài)到當(dāng)前項(xiàng)目,而是將目標(biāo) POM 的依賴(lài)管理規(guī)則合并到當(dāng)前項(xiàng)目的依賴(lài)管理中。 | 導(dǎo)入 Spring Boot 的 spring-boot-dependencies |
依賴(lài)傳遞性
Maven 依賴(lài)的傳遞性會(huì)受 <scope> 影響。
假設(shè) A → B → C,即 A 依賴(lài) B,B 依賴(lài) C:
- compile:C 會(huì)傳遞給 A(A 的 compile 范圍)
- runtime:C 會(huì)傳遞給 A(A 的 runtime 范圍)
- test / provided:C 不會(huì)傳遞給 A(僅 B 自己需要)
依賴(lài)沖突
當(dāng)多個(gè)依賴(lài)項(xiàng)引入相同的依賴(lài),這時(shí)就可能出現(xiàn)版本沖突。
如:在projectA引入B依賴(lài),B依賴(lài)又引入C依賴(lài)(版本1.0),假設(shè)這時(shí)projectA再引入D依賴(lài),且D依賴(lài)也引入C依賴(lài)(版本2.0)。這時(shí)就會(huì)出現(xiàn)依賴(lài)沖突。
沖突解決原則
1、就近原則
A --> B --> C(版本1.0)
A --> C(版本2.0)
這時(shí)會(huì)引入2.0的C
2、第一聲明者原則
A -> B -> C(版本1.0)
A -> D -> C(版本2.0)
這時(shí)會(huì)引入1.0的C
解決方案
使用<exclusions> 標(biāo)簽排除沖突的依賴(lài),只保留一個(gè)依賴(lài)。
如:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<exclusions>
<exclusion>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</exclusion>
</exclusions>
</dependency>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
面試時(shí)必問(wèn)的JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)詳解
這篇文章主要介紹了JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-08-08
Springboot任務(wù)之異步任務(wù)的使用詳解
今天學(xué)習(xí)了一個(gè)新技能SpringBoot實(shí)現(xiàn)異步任務(wù),所以特地整理了本篇文章,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
Mybatis-Plus 映射匹配兼容性的問(wèn)題解決
本文主要介紹了Mybatis-Plus 映射匹配兼容性的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
簡(jiǎn)單的用java實(shí)現(xiàn)讀/寫(xiě)文本文件的示例
同時(shí)也展示了如果從輸入流中讀出來(lái)內(nèi)容寫(xiě)入輸出流中(僅限文本流) 三個(gè)例子可以獨(dú)立存在,所以根據(jù)需要只看其中一個(gè)就行了。2008-07-07
解決Spring Data Jpa 實(shí)體類(lèi)自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表失敗問(wèn)題
這篇文章主要介紹了解決Spring Data Jpa 實(shí)體類(lèi)自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表失敗問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09

