欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

1,依賴作用域

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

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

上面我們就設(shè)定了lombok這個依賴的作用域為provided

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

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

可見一個Maven項目,從編譯到運行會經(jīng)歷三個階段:編譯 → 測試 → 運行

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

編譯時可用測試時可用運行時可用
compile
providedx
runtimex
testxx

2,作用域和打包

我們常常會使用maven-assembly-plugin插件,讓我們在打包的時候?qū)⑺械囊蕾嚩即虬磷詈蟮?code>jar文件中,使得jar文件可以直接運行。

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

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

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

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

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

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

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

3,依賴的傳遞

事實上,在Maven中,依賴也是會傳遞的,我們先創(chuàng)建一個名為first的項目,并引入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>

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

現(xiàn)在在新建項目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項目 -->
		<dependency>
			<groupId>com.gitee.swsk33</groupId>
			<artifactId>first</artifactId>
			<version>1.0.0</version>
		</dependency>
	</dependencies>
</project>

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

image.png

可見second項目僅僅是引入了first項目,但為什么外部庫中包含了lombok依賴呢?這是因為first依賴lombok,而second依賴first時,lombok也被傳遞給了second。

image.png

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

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

(1) scope作用域

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

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

(2) optional字段

除了scope之外,還可以設(shè)定依賴的optional字段,當(dāng)設(shè)定為true時代表這個依賴是可選的,那么這時無論其scope是什么,這個依賴都不會傳遞。默認(rèn)情況下,即不聲明依賴的optional字段時,它的值是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項目,你就會發(fā)現(xiàn)lombok依賴就沒有傳遞過來了!

image.png

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

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

相關(guān)文章

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

    解決Error occurred during initialization o

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

    Java中的@Accessors使用詳解

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

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

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

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

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

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

    棧和隊列,嚴(yán)格意義上來說,也屬于線性表,因為它們也都用于存儲邏輯關(guān)系為 "一對一" 的數(shù)據(jù),但由于它們比較特殊,因此將其單獨作為一章,做重點講解
    2022-02-02
  • 帶你了解mybatis如何實現(xiàn)讀寫分離

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

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

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

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

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

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

    Java微信公眾號推送模版消息的步驟示例詳解

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

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

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

最新評論