亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Maven依賴作用域和依賴傳遞的使用

 更新時(shí)間:2023年06月02日 08:57:35   作者:守望時(shí)空33  
本文主要介紹了Maven依賴作用域和依賴傳遞的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在Java項(xiàng)目開發(fā)中,Maven是我們最常用的依賴管理和構(gòu)建工具了!我們常常通過添加dependency節(jié)點(diǎn),就能夠很方便地加入依賴,而不需要我們自己去手動(dòng)下載jar文件并引入。

今天主要是來總結(jié)一下在Maven中依賴的作用域和傳遞。

1,依賴作用域

通過在每個(gè)dependency中設(shè)定scope字段,即可聲明其作用域,例如:

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.28</version>
	<!-- 聲明作用域 -->
	<scope>provided</scope>
</dependency>

上面我們就設(shè)定了lombok這個(gè)依賴的作用域?yàn)?code>provided。

常用的作用域字段值及其意義如下:

  • compile 這是默認(rèn)scope(即你不寫scope字段的話,這個(gè)依賴作用域就是compile),表示依賴在編譯、測(cè)試運(yùn)行時(shí)都是可用的,并且會(huì)參與項(xiàng)目的打包過程,該依賴會(huì)傳遞給依賴該模塊的其他模塊
  • provided 表示依賴在編譯測(cè)試時(shí)是可用的,但該依賴不會(huì)參與程序運(yùn)行階段,即程序運(yùn)行時(shí)無法調(diào)用該依賴中的類,它不會(huì)參與項(xiàng)目的打包過程,也不會(huì)傳遞給其他模塊
  • runtime 表示依賴僅在運(yùn)行時(shí)是可用的,但在編譯和測(cè)試時(shí)不需要,它會(huì)傳遞給依賴該模塊的其他模塊,但不會(huì)參與項(xiàng)目的打包過程
  • test 表示依賴只在測(cè)試運(yùn)行時(shí)使用,不會(huì)參與項(xiàng)目的打包過程,也不會(huì)傳遞給其他模塊

可見一個(gè)Maven項(xiàng)目,從編譯到運(yùn)行會(huì)經(jīng)歷三個(gè)階段:編譯 → 測(cè)試 → 運(yùn)行

不同作用域在三個(gè)階段的可見性如下表:

編譯時(shí)可用測(cè)試時(shí)可用運(yùn)行時(shí)可用
compile
providedx
runtimex
testxx

2,作用域和打包

我們常常會(huì)使用maven-assembly-plugin插件,讓我們?cè)诖虬臅r(shí)候?qū)⑺械囊蕾嚩即虬磷詈蟮?code>jar文件中,使得jar文件可以直接運(yùn)行。

不過真的是所有的依賴都會(huì)被打包到最后的jar中嗎?

其實(shí)并不是,在使用maven-assembly-plugin插件插件時(shí),默認(rèn)只有scopecompileruntime的依賴才會(huì)被包含在最終的結(jié)果中。

因此,為了減小最終jar的大小,我們應(yīng)當(dāng)將運(yùn)行時(shí)不需要的依賴設(shè)置為provided或者test,當(dāng)然這也是根據(jù)用途選擇。

例如lombok依賴會(huì)在編譯的時(shí)候生成gettersetter的代碼,但是運(yùn)行的時(shí)候這個(gè)依賴就不需要了,因此它常常被設(shè)定為provided。

但是在Spring Boot開發(fā)中就不一樣了,Spring Boot工程中,使用的是spring-boot-maven-plugin,這個(gè)插件也能完成同樣的目的,即打包時(shí)將所有的依賴全部打包到一個(gè)jar中,但是這個(gè)插件會(huì)將所有的依賴都打包進(jìn)去,無論其scope是什么。

不過,我們可以在這個(gè)插件中進(jìn)行配置,聲明打包時(shí)需要排除的依賴,例如:

<plugin>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-maven-plugin</artifactId>
	<configuration>
		<excludes>
			<!-- 打包時(shí)排除lombok依賴 -->
			<exclude>
				<groupId>org.projectlombok</groupId>
				<artifactId>lombok</artifactId>
			</exclude>
		</excludes>
	</configuration>
</plugin>

3,依賴的傳遞

事實(shí)上,在Maven中,依賴也是會(huì)傳遞的,我們先創(chuàng)建一個(gè)名為first的項(xiàng)目,并引入lombok依賴如下:

<?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.gitee.swsk33</groupId>
	<artifactId>first</artifactId>
	<version>1.0.0</version>
	<properties>
		<java.version>17</java.version>
		<maven.compiler.source>${java.version}</maven.compiler.source>
		<maven.compiler.target>${java.version}</maven.compiler.target>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<dependencies>
		<!-- 引入lombok依賴 -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.28</version>
		</dependency>
	</dependencies>
</project>

這是項(xiàng)目firstpom.xml文件,其groupIdcom.gitee.swsk33,其artifactIdfirst,其版本為1.0.0,現(xiàn)在在其工程目錄下執(zhí)行mvn clean install安裝至本地倉庫使得待會(huì)可以引用它。

現(xiàn)在在新建項(xiàng)目second,并引用上述的first作為依賴,如下:

<?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.gitee.swsk33</groupId>
	<artifactId>second</artifactId>
	<version>1.0.0</version>
	<properties>
		<java.version>17</java.version>
		<maven.compiler.source>${java.version}</maven.compiler.source>
		<maven.compiler.target>${java.version}</maven.compiler.target>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<dependencies>
		<!-- 引用first項(xiàng)目 -->
		<dependency>
			<groupId>com.gitee.swsk33</groupId>
			<artifactId>first</artifactId>
			<version>1.0.0</version>
		</dependency>
	</dependencies>
</project>

好的,現(xiàn)在展開IDEA左側(cè)欄的外部庫部分,看看second項(xiàng)目的依賴:

image.png

可見second項(xiàng)目僅僅是引入了first項(xiàng)目,但為什么外部庫中包含了lombok依賴呢?這是因?yàn)?code>first依賴lombok,而second依賴first時(shí),lombok也被傳遞給了second。

image.png

同樣地,如果現(xiàn)在又有一個(gè)項(xiàng)目third依賴second呢?那么third也會(huì)間接依賴lombok,也可以使用lombok中的類。

當(dāng)然,依賴并不總是會(huì)傳遞的,有下列因素會(huì)影響依賴傳遞。

(1) scope作用域

scope不僅僅代表這個(gè)依賴的作用域,也會(huì)影響依賴的傳遞,只有scopecompileruntime的依賴是會(huì)傳遞的。

假設(shè)現(xiàn)在把上述first項(xiàng)目中的lombok依賴scope改成provided或者test,然后重新執(zhí)行mvn clean install,你就會(huì)發(fā)現(xiàn)在second的依賴中,就看不到lombok了!

(2) optional字段

除了scope之外,還可以設(shè)定依賴的optional字段,當(dāng)設(shè)定為true時(shí)代表這個(gè)依賴是可選的,那么這時(shí)無論其scope是什么,這個(gè)依賴都不會(huì)傳遞。默認(rèn)情況下,即不聲明依賴的optional字段時(shí),它的值是false。

現(xiàn)在將first中的lombok依賴的optional字段聲明為true

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.28</version>
	<optional>true</optional>
</dependency>

然后重新mvn clean install,再次打開second項(xiàng)目,你就會(huì)發(fā)現(xiàn)lombok依賴就沒有傳遞過來了!

image.png

所以如果在制作外部庫需要其他人引用的時(shí)候,我們可以將一些僅僅是外部庫需要使用但是其它項(xiàng)目不一定要使用的依賴的optional設(shè)定為true,避免其他開發(fā)者引入你的外部庫時(shí)發(fā)生依賴沖突。

到此這篇關(guān)于Maven依賴作用域和依賴傳遞的使用的文章就介紹到這了,更多相關(guān)Maven依賴作用域和依賴傳遞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決Error occurred during initialization of VM Java虛擬機(jī)初始化失敗問題

    解決Error occurred during initialization o

    這篇文章主要介紹了解決Error occurred during initialization of VM Java虛擬機(jī)初始化失敗問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Java中的@Accessors使用詳解

    Java中的@Accessors使用詳解

    這篇文章主要介紹了Java中的@Accessors使用詳解,@RequiredArgsConstructor是Lombok的一個(gè)注解,簡化了我們對(duì)setter和getter方法操作,它可以作用在類上,也可以作用在類的單個(gè)屬性上,需要的朋友可以參考下
    2024-01-01
  • SSH框架網(wǎng)上商城項(xiàng)目第16戰(zhàn)之Hibernate二級(jí)緩存處理首頁熱門顯示

    SSH框架網(wǎng)上商城項(xiàng)目第16戰(zhàn)之Hibernate二級(jí)緩存處理首頁熱門顯示

    這篇文章主要介紹了SSH框架網(wǎng)上商城項(xiàng)目第16戰(zhàn)之Hibernate的二級(jí)緩存處理首頁的熱門顯示,感興趣的小伙伴們可以參考一下
    2016-06-06
  • java學(xué)生信息管理系統(tǒng)源代碼

    java學(xué)生信息管理系統(tǒng)源代碼

    這篇文章主要為大家詳細(xì)介紹了java學(xué)生信息管理系統(tǒng)源代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java 棧和隊(duì)列的相互轉(zhuǎn)換詳解

    Java 棧和隊(duì)列的相互轉(zhuǎn)換詳解

    棧和隊(duì)列,嚴(yán)格意義上來說,也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯?chǔ)邏輯關(guān)系為 "一對(duì)一" 的數(shù)據(jù),但由于它們比較特殊,因此將其單獨(dú)作為一章,做重點(diǎn)講解
    2022-02-02
  • 帶你了解mybatis如何實(shí)現(xiàn)讀寫分離

    帶你了解mybatis如何實(shí)現(xiàn)讀寫分離

    本篇文章主要介紹了MyBatis實(shí)現(xiàn)數(shù)據(jù)讀寫分離的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-08-08
  • SpringSecurity拋出異常但AccessDeniedHandler不生效的解決

    SpringSecurity拋出異常但AccessDeniedHandler不生效的解決

    本文主要介紹了SpringSecurity拋出異常但AccessDeniedHandler不生效的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • Java Json字符串的雙引號(hào)(

    Java Json字符串的雙引號(hào)("")括號(hào)如何去掉

    這篇文章主要介紹了Java Json字符串的雙引號(hào)("")括號(hào)如何去掉?具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java微信公眾號(hào)推送模版消息的步驟示例詳解

    Java微信公眾號(hào)推送模版消息的步驟示例詳解

    模板消息是一種向用戶發(fā)送通知的服務(wù),廣泛用于訂單狀態(tài)更新、服務(wù)提醒等場(chǎng)景,下面,我將詳細(xì)介紹如何使用Java結(jié)合微信官方提供的API來實(shí)現(xiàn)模板消息的推送,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • Spring Core核心類庫的功能與應(yīng)用實(shí)踐分析

    Spring Core核心類庫的功能與應(yīng)用實(shí)踐分析

    本文詳細(xì)介紹了SpringCore核心類庫的功能、應(yīng)用實(shí)踐和底層原理,SpringCore提供了控制反轉(zhuǎn)(IOC)、依賴注入(DI)、Bean管理以及JNDI、定時(shí)任務(wù)等企業(yè)級(jí)功能,文章通過多個(gè)Java示例展示了SpringCore的應(yīng)用,感興趣的朋友跟隨小編一起看看吧
    2024-12-12

最新評(píng)論