国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

聊聊Maven的依賴傳遞、依賴管理、依賴作用域

這篇具有很好參考價(jià)值的文章主要介紹了聊聊Maven的依賴傳遞、依賴管理、依賴作用域。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1. 依賴傳遞

在Maven中,依賴是會(huì)傳遞的,假如在業(yè)務(wù)項(xiàng)目中引入了spring-boot-starter-web依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  	<version>2.7.4</version>
</dependency>

那么業(yè)務(wù)項(xiàng)目不僅直接引入了spring-boot-starter-web依賴,還間接引入了spring-boot-starter-web的依賴項(xiàng):

spring-boot-starter、spring-boot-starter-jsonspring-boot-starter-tomcat、spring-web、spring-webmvc

Maven依賴關(guān)系如下圖所示:

外部庫(kù)如下圖所示:

其中,業(yè)務(wù)項(xiàng)目對(duì)spring-boot-starter-web的依賴稱為直接依賴,對(duì)spring-boot-starter-web的依賴項(xiàng):

spring-boot-starter、spring-boot-starter-jsonspring-boot-starter-tomcat、spring-webspring-webmvc

的依賴稱為間接依賴。

2. 依賴管理

dependencyManagement元素主要用來(lái)統(tǒng)一管理依賴項(xiàng)的版本號(hào)。

假如父項(xiàng)目的pom文件中聲明了如下依賴:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.4</version>
        </dependency>
    </dependencies>
</dependencyManagement>    

那么子項(xiàng)目在添加該依賴時(shí),可以不指定版本號(hào):

<dependencies>
		<dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-collections4</artifactId>
    </dependency>
</dependencies>

Maven會(huì)自動(dòng)找到父項(xiàng)目中聲明的該依賴項(xiàng)的版本號(hào),如下圖所示:

這樣的優(yōu)點(diǎn)是可以統(tǒng)一在父項(xiàng)目中管理依賴項(xiàng)的版本號(hào),如果需要升級(jí)版本,只需改動(dòng)父項(xiàng)目一個(gè)地方即可,子項(xiàng)目不用改動(dòng)。

說(shuō)明:

1)dependencyManagement只是聲明依賴項(xiàng),并沒(méi)引入依賴項(xiàng),子項(xiàng)目仍需顯式引入,不過(guò)可以不指定版本號(hào)

2)如果子項(xiàng)目不想使用繼承的父項(xiàng)目中的版本號(hào),在子項(xiàng)目中指定版本號(hào)即可

3. 依賴作用域

在Maven中,可以使用scope來(lái)指定當(dāng)前依賴項(xiàng)的作用域,常見(jiàn)的值有:compile、provided、runtime、test、import等,如下所示:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <scope>test</scope>
</dependency>

3.1 compile

compile是默認(rèn)的作用域,如果引入依賴時(shí),沒(méi)有明確指定作用域,則依賴作用域?yàn)閏ompile。

作用域?yàn)閏ompile的依賴,在編譯、測(cè)試和運(yùn)行時(shí)都是可用的,并且會(huì)參與項(xiàng)目的打包過(guò)程,該依賴會(huì)傳遞給依賴該模塊的其他模塊。

3.2 provided

作用域?yàn)閜rovided的依賴,在編譯和測(cè)試時(shí)是可用的,在運(yùn)行時(shí)是不可用的,不會(huì)參與項(xiàng)目的打包過(guò)程,也不會(huì)傳遞給其他模塊。

比如lombok依賴會(huì)在編譯時(shí)生成相應(yīng)的get、set等方法,在運(yùn)行時(shí)就不需要這個(gè)依賴了,因此常常被指定為provided:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.16</version>
    <scope>provided</scope>
</dependency>

因?yàn)楸恢付閜rovided,項(xiàng)目打包時(shí)是不包含lombok依賴項(xiàng)的,如下圖所示:

如果將上面的代碼<scope>provided</scope>刪除的話,運(yùn)行時(shí)是下圖這樣的:

以上驗(yàn)證需將項(xiàng)目打包方式改為war,打包后查看WEB-INF/lib目錄

3.3 runtime

作用域?yàn)閞untime的依賴,在測(cè)試和運(yùn)行時(shí)是可用的,在編譯時(shí)是不可用的,會(huì)參與項(xiàng)目的打包過(guò)程,也會(huì)傳遞給依賴該模塊的

其他模塊。

說(shuō)明:

作用域?yàn)閞untime的依賴中的類,在項(xiàng)目代碼里不能直接用,用了無(wú)法通過(guò)編譯(這里指的是在src/main/java下使用)。

以mysql-connector-java為例,假如引入依賴時(shí)是下面這樣的:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.30</version>
</dependency>

下面的示例代碼是可以編譯通過(guò)的:

如果將作用域修改為runtime,上面的示例代碼無(wú)法通過(guò)編譯:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.30</version>
    <scope>runtime</scope>
</dependency>

3.4 test

作用域?yàn)閠est的依賴,只在測(cè)試時(shí)可用(包括測(cè)試代碼的編譯、執(zhí)行),不會(huì)參與項(xiàng)目的打包過(guò)程,也不會(huì)傳遞給其他模塊。

常見(jiàn)的有junit、mockito等:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

因?yàn)楸恢付閠est,項(xiàng)目打包時(shí)是不包含junit依賴項(xiàng)的,如下圖所示:

如果將上面的代碼<scope>test</scope>刪除的話,運(yùn)行時(shí)是下圖這樣的:

以上驗(yàn)證需將項(xiàng)目打包方式改為war,打包后查看WEB-INF/lib目錄

說(shuō)明:

作用域?yàn)閠est的依賴中的類或者注解只能在src/test/java下才可以使用,在src/main/java下無(wú)法使用,如junit包下的@Test注解和org.junit.Assert斷言類。

3.5 import

每個(gè)項(xiàng)目,一般都會(huì)繼承自一個(gè)父項(xiàng)目,在實(shí)際的工作中,這個(gè)父項(xiàng)目一般都是公司架構(gòu)組提供的帶有公司特色的一個(gè)基礎(chǔ)項(xiàng)目,

當(dāng)然也可以是spring boot官方的項(xiàng)目。

以spring boot官方的項(xiàng)目為例:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.4</version>
</parent>

這個(gè)父項(xiàng)目中,會(huì)使用dependencyManagement標(biāo)簽對(duì)依賴項(xiàng)的版本統(tǒng)一管理,子項(xiàng)目中,可以按需引入父項(xiàng)目

dependencyManagement中定義的依賴,但可以不指定版本號(hào)(版本號(hào)會(huì)自動(dòng)繼承父項(xiàng)目中定義的版本號(hào))。

但是存在以下2個(gè)問(wèn)題:

  1. Maven是單繼承的,一個(gè)項(xiàng)目只能有一個(gè)parent項(xiàng)目
  2. parent項(xiàng)目dependencyManagement中的依賴項(xiàng)會(huì)越來(lái)越多,不好管理

依賴作用域import的出現(xiàn)就是為了解決以上問(wèn)題,它可以通過(guò)非繼承的方式批量引入另一個(gè)依賴項(xiàng)中

dependencyManagement元素中定義的依賴項(xiàng),如下所示:

<dependencyManagement>
    <dependency>
      <groupId>org.springframework.session</groupId>
      <artifactId>spring-session-bom</artifactId>
      <version>${spring-session-bom.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

說(shuō)明:<scope>import</scope>只能用在dependencyManagement下type為pom的dependency中。

以上代碼等價(jià)于添加了以下6個(gè)依賴項(xiàng):

可以看出,使用<scope>import</scope>可以模塊化的管理依賴項(xiàng),提高復(fù)用性,pom文件也更加簡(jiǎn)潔。

3.6 區(qū)別

綜上所述,各個(gè)依賴作用域的區(qū)別如下表所示:

scope取值 編譯時(shí)可用 測(cè)試時(shí)可用 運(yùn)行時(shí)可用 是否參與打包 依賴傳遞
compile
provided × × ×
runtime ×
test × × × ×

4. 影響依賴傳遞的因素

4.1 依賴作用域(scope)

依賴作用域會(huì)影響依賴傳遞,從上表可以看出,如果scope為provided或者test,該依賴不會(huì)傳遞,只有scope為compile或者runtime,

該依賴才會(huì)傳遞。

4.2 可選依賴(optional)

通過(guò)dependency標(biāo)簽引入依賴時(shí),可以通過(guò)<optional>指定該依賴是不是可選的,默認(rèn)值為false:

<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
	  <version>3.2.3</version>
    <optional>true</optional>
</dependency>

如果<optional>值為true,那么這個(gè)依賴不會(huì)傳遞。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-711684.html

到了這里,關(guān)于聊聊Maven的依賴傳遞、依賴管理、依賴作用域的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Maven 依賴傳遞和沖突、繼承和聚合

    Maven 依賴傳遞和沖突、繼承和聚合

    1.1.1 概念 ????????假如有三個(gè) Maven 項(xiàng)目 A 、 B 和 C ,其中項(xiàng)目 A? 依賴 B ,項(xiàng)目 B? 依賴 C 。那么我們可以說(shuō) A 依賴 C 。也就是說(shuō),依賴的關(guān)系為: A—B—C , 那么我們執(zhí)行項(xiàng)目 A 時(shí),會(huì)自動(dòng)把 B 和 C 都下載導(dǎo)入到 A 項(xiàng)目的 jar 包文件夾中,這就是依賴的傳遞性。 1.1.2?作

    2024年01月21日
    瀏覽(22)
  • 【Maven教程】(四)坐標(biāo)與依賴:坐標(biāo)概念,依賴配置、范圍、傳遞性和最佳實(shí)踐 ~

    【Maven教程】(四)坐標(biāo)與依賴:坐標(biāo)概念,依賴配置、范圍、傳遞性和最佳實(shí)踐 ~

    正如前面文章所述,Maven 的一大功能是管理項(xiàng)目依賴。為了能自動(dòng)化地解析任何一個(gè) Java 構(gòu)件, Maven 就必須將它們唯一標(biāo)識(shí),這就依賴管理的底層基礎(chǔ)——坐標(biāo)。本節(jié)將詳細(xì)分析 Maven 坐標(biāo)的作用,解釋其每一個(gè)元素;在此基礎(chǔ)上,再介紹如何配置Maven, 以及相關(guān)的經(jīng)驗(yàn)和技巧

    2024年02月09日
    瀏覽(49)
  • maven的scop作用域依賴問(wèn)題導(dǎo)致idea社區(qū)版報(bào)錯(cuò)

    1. 錯(cuò)誤:代碼沒(méi)改,卸了專業(yè)版后改用社區(qū)版出現(xiàn)以下報(bào)錯(cuò) 2024-01-08 16:34:29.374 ERROR [main] org.springframework.boot.SpringApplication.reportFailure:823 Application run failed java.lang.IllegalStateException: Error processing condition on org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration.propertySourc

    2024年02月02日
    瀏覽(19)
  • 解決maven 父工程依賴傳遞導(dǎo)致的 java.lang.NoClassDefFoundError: org/elasticsearch/xcontent/ToXContentObject

    因?yàn)轫?xiàng)目需要,最近在學(xué)習(xí)elasticsearch,在使用elasticsearch Java 客戶端時(shí),出現(xiàn)了寫問(wèn)題,主要就是報(bào)各種的 NoClassDefFoundError 如: java.lang.NoClassDefFoundError: org/elasticsearch/xcontent/ToXContentObject ,出現(xiàn)這種 NoClassDefFoundError 的問(wèn)題基本上就是maven 依賴錯(cuò)誤或者版本不對(duì),于是順著這個(gè)

    2023年04月08日
    瀏覽(32)
  • 【Android Gradle 插件】Android 依賴管理 ④ ( 常用依賴配置分析 | implementation 依賴作用 | api 依賴作用 | compileOnly 依賴作用 )

    在本篇博客中逐一分析以下依賴配置 : implementation api compileOnly runtimeOnly annotationProcessor lintChecks lintPublish apk ( 已廢棄 ) compile ( 已廢棄 ) provided ( 已廢棄 ) Android 依賴參考文檔 : https://developer.android.google.cn/studio/build/dependencies compile 依賴作用: 編譯打包 : 為 自己的項(xiàng)目模塊 添加依

    2024年02月02日
    瀏覽(25)
  • maven-依賴管理-下

    maven-依賴管理-下

    依賴沖突 特殊優(yōu)先 特殊優(yōu)先∶當(dāng)同級(jí)配置了相同資源的不同版本,后配置的覆蓋先配置的(提醒:要盡量避免這種沒(méi)有意義的沖突) 修改D:java_projectsmaven_Apom.xml, 引入mysql5.1 根據(jù)特殊優(yōu)先原則: maven_A 生效的是mysql5.1.43 測(cè)試完后,注銷到引入mysql5.1.43 , 這里是為了驗(yàn)證. 可選依

    2024年02月16日
    瀏覽(71)
  • Maven高級(jí)-分模塊開發(fā)&依賴管理

    Maven高級(jí)-分模塊開發(fā)&依賴管理

    目標(biāo) 理解并實(shí)現(xiàn)分模塊開發(fā) (1)按照功能拆分 我們現(xiàn)在的項(xiàng)目都是在一個(gè)模塊中,比如前面的SSM整合開發(fā)。雖然這樣做功能也都實(shí)現(xiàn)了,但是也存在了一些問(wèn)題,我們拿銀行的項(xiàng)目為例來(lái)聊聊這個(gè)事。 網(wǎng)絡(luò)沒(méi)有那么發(fā)達(dá)的時(shí)候,我們需要到銀行柜臺(tái)或者取款機(jī)進(jìn)行業(yè)務(wù)操作

    2023年04月09日
    瀏覽(24)
  • 基于IDEA 進(jìn)行Maven依賴管理

    基于IDEA 進(jìn)行Maven依賴管理

    Maven 依賴管理是 Maven 軟件中最重要的功能之一。Maven 的依賴管理能夠幫助開發(fā)人員自動(dòng)解決軟件包依賴問(wèn)題,使得開發(fā)人員能夠輕松地將其他開發(fā)人員開發(fā)的模塊或第三方框架集成到自己的應(yīng)用程序或模塊中,避免出現(xiàn)版本沖突和依賴缺失等問(wèn)題。 我們通過(guò)定義 POM 文件,

    2024年01月23日
    瀏覽(18)
  • 基于 IDEA 進(jìn)行 Maven 依賴管理

    基于 IDEA 進(jìn)行 Maven 依賴管理

    ???????? Maven 依賴管理是 Maven 軟件中最重要的功能之一。 Maven 的依賴管理能夠幫助開發(fā)人員自動(dòng)解決軟件包依賴問(wèn)題,使得開發(fā)人員能夠輕松地將其他開發(fā)人員開發(fā)的模塊或第三方框架集成到自己的應(yīng)用程序或模塊中,避免出現(xiàn)版本沖突和依賴缺失等問(wèn)題。 ???????

    2024年01月19日
    瀏覽(40)
  • MAVEN利器:一文帶你了解MAVEN中的依賴管理

    MAVEN利器:一文帶你了解MAVEN中的依賴管理

    強(qiáng)大的構(gòu)建工具——Maven。作為Java生態(tài)系統(tǒng)中的重要組成部分,Maven為開發(fā)人員提供了一種簡(jiǎn)單而高效的方式來(lái)構(gòu)建、管理和發(fā)布Java項(xiàng)目。無(wú)論是小型項(xiàng)目還是大型企業(yè)級(jí)應(yīng)用,Maven都能幫助開發(fā)人員輕松處理依賴管理、編譯、測(cè)試和部署等任務(wù)。 在上一篇文章中,我們學(xué)習(xí)

    2024年02月10日
    瀏覽(32)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包