Maven依賴

3.1 依賴的配置

一個依賴聲明可以包含下面元素:

<dependencies>
    <dependency>
        <groupId></groupId>
        <artifactId></artifactId>
        <version></version>
        <type></type>
        <scope></scope>
        <optional></optional>
        <exclusions>
            <exclusion>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

groupId、artifactId、version依賴的基本坐標(biāo)。
type:依賴的類型,對應(yīng)于項目坐標(biāo)定義的packaging,默認(rèn):jar
scope:依賴的范圍。
optional:標(biāo)志依賴是否可選,true/false。
exclusions:用來排除傳遞性依賴。

3.2 依賴范圍

依賴范圍是用來控制依賴于三種classpath(編譯classpath、測試classpath、運行classpath)的關(guān)系。
Maven的依賴范圍有如下幾種:
compile:編譯依賴范圍,默認(rèn)值,對三種classpath都有效。
test:測試依賴范圍,只對測試classpath有效,典型例子如:Junit
provided:已提供依賴范圍,對編譯和測試classpath有效,但在運行時無效,典型例子如:servlet-api,運行時由容器提供。
runtime:運行時依賴范圍,對測試和運行classpath有效,編譯主代碼時無效,典型例子如:JDBC驅(qū)動實現(xiàn),編譯時只需要JDK提供的JDBC接口,運行才需要具體的實現(xiàn)。
system:系統(tǒng)依賴范圍,對編譯和測試classpath有效,但在運行時無效。使用該范圍時,必須通過systemPath元素指定依賴的路徑。

    <dependency>
        <groupId>javax.sql</groupId>
        <artifactId>jdbc-stdext</artifactId>
        <version>2.0</version>
        <scope>system</scope>
        <systemPath>${java.home}/lib/rt.jar</systemPath>
    </dependency>

import:導(dǎo)入依賴范圍,該范圍不會對三種classpath產(chǎn)生實際應(yīng)用,會將目標(biāo)POM中的dependencyManagement配置導(dǎo)入合并到當(dāng)前POMdependencyManagement元素中。

依賴范圍

3.3 傳遞性依賴和依賴范圍

Maven的傳遞性依賴是指不需要考慮你依賴的庫文件所需要依賴的庫文件,能夠?qū)⒁蕾嚹K的依賴自動的引入。

依賴的范圍不僅可以控制依賴與三種classpath的關(guān)系,還會對傳遞性依賴產(chǎn)生影響。假設(shè)A依賴于B,B依賴于C,則說A對于B是第一直接依賴,B對C是第二直接依賴,A對于C是傳遞依賴。第一直接依賴范圍和第二直接依賴范圍決定了傳遞性依賴的范圍,其結(jié)果如下:

傳遞性依賴

  第二直接依賴范圍是`compile`時,傳遞性依賴范圍與第一直接依賴范圍一致;
  第二直接依賴范圍是`test`時,依賴不會得以傳遞;
  第二直接依賴范圍是`provided`時,只傳遞第一直接依賴范圍也為provided的;
  第二直接依賴范圍是`runtime`時,傳遞性依賴的范圍與第一直接依賴范圍一致,`compile`例如,此時的傳遞性依賴范圍為`runtime`。

3.4 依賴調(diào)解

一般情況下,只關(guān)心項目的直接依賴,而不關(guān)心直接依賴引入的傳遞性依賴,但當(dāng)傳遞性依賴出現(xiàn)問題時,需要知道該傳遞性依賴是怎么引進來的。
Maven依賴調(diào)解第一原則:路徑最近者優(yōu)先,如:A->B->C->X(1.0)、A->D-X(2.0),則X的2.0版本會被解析使用;
Maven依賴調(diào)解第二原則:第一聲明者優(yōu)先,如:A->B->X(1.0)、A->D->X(2.0),若B的依賴聲明在D之前,則使用X的1.0版本,否則使用X的2.0版本。

3.5 可選依賴

假設(shè)有下面的依賴關(guān)系:A->B、B->X(可選)、B->Y(可選),由于X和Y是可選的,所以依賴不會傳遞,X和Y不會對A有任何影響。

可選依賴的必要性:項目B實現(xiàn)2種特性,特性一依賴于X,特性二依賴于Y,而且這兩個特性是互斥的,用戶不可能同時適用這兩個特性,這時候可選依賴就有用了。
原則上說,是不應(yīng)該使用可選依賴的,根據(jù)面向?qū)ο蟮膯我宦氊?zé)性原則,該原則同樣適用于Maven項目的規(guī)劃。

3.6 最佳實踐

1)排除依賴

傳遞性依賴會給項目隱式的引入很多依賴,這極大的簡化了項目依賴的管理,但是有時某些依賴會帶來問題,這時需要把帶來問題的依賴排除掉。

2)歸類依賴
來自同一個項目的不同模塊,其版本號應(yīng)該是相同的,如springframework項目有spring-corespring-beans模塊,對這些模塊的版本號通過屬性定義,再進行引用,這樣可以進行版本的整體升級:

    <properties>
        <springframework.version>4.3.13.RELEASE</springframework.version>
    </properties>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${springframework.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${springframework.version}</version>
    </dependency>

3)優(yōu)化依賴

去掉多余的依賴,顯示聲明某些必要的依賴。
通過mvn dependency:list 查看項目已解析的依賴
通過mvn dependency:tree 查看項目的依賴樹

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,697評論 19 139
  • 傳遞性依賴 傳遞性依賴是Maven2.0的新特性。假設(shè)你的項目依賴于一個庫,而這個庫又依賴于其他庫。你不必自己去找...
    歐余山南閱讀 1,287評論 0 0
  • maven項目中需要使用到其它依賴時,則需要在pom.xml中配置<dependency>元素也就是依賴聲明,這樣...
    zlcook閱讀 2,058評論 1 3
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,288評論 6 342
  • 我的童年是? 我想告訴大家的是:我的童年形象就是男人婆?。?!徹徹底底的男人婆! 我生活在鄉(xiāng)村里...
    胡敏宜閱讀 251評論 2 0

友情鏈接更多精彩內(nèi)容