maven依賴與傳遞性依賴


本文主要是針對《maven實戰》書中關鍵知識點的學習記錄,未免有紕漏或描述不到之處,建議購買閱讀原書

首先貼出一個pom常見的一些元素釋義

<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.example</groupId>
    <artifactId>my-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>my-demo</name>
    <packaging>pom</packaging>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>


    <dependencies>
        <dependency>
            <groupId></groupId>
            <artifactId></artifactId>
            <version>版本</version>
            <type>依賴的類型,對應於項目的packing,默認是jar</type>
            <scope>依賴范圍</scope>
            <systemPath>配合 scope=system時使用</systemPath>
            <optional>標記是否為可選依賴</optional>
            <exclusions>
                用來排除傳遞性依賴
                <exclusion>

                </exclusion>
            </exclusions>

        </dependency>
    </dependencies>

</project>

前面的坐標聲明到依賴類型,都應該比較好理解,這里我們從依賴范圍開始介紹起

依賴范圍

maven中的依賴范圍一共有以下幾種

  • compile 默認,對於編譯,測試,運行三個狀態都有效
  • test 顧名思義,只針對執行test代碼
  • provided 對於編譯和測試時有效,但運行時無效,典型的時servlet-api,運行時這個由容器來提供
  • runtime 對測試和運行時有效,但編譯時無效
  • system 與provided的范圍一樣,但system必須顯示的指定依賴文件,通過<systemPath>來進行指定,是與本機綁定的,所以基本很少用到
  • import 不會對3總產生實際的影響,只能在dependencyManagement中使用

以表格來表示的,如下

scope 編譯 測試 運行
compile Y Y Y
test Y
provided Y Y
runtime Y Y
system Y Y

傳遞性依賴

我們的工程,所使用的大多數情況下,不會只有一成依賴關系,例如 a依賴b,我們用a->b表示,那么,a->b,b->c,則a對於b是第一依賴,b對於c是第二依賴,而a對於c是傳遞性依賴

傳遞性依賴的scope傳遞規則,與第一依賴和第二依賴有關,下表第一列表示第一依賴,第一行表示第二依賴

compile test provided runtime
compile compile runtime
test test test
provided provided provided provided
runtime runtie runtime

從上表我們可以輕松得到幾點信息

- 第二依賴為complie不改變第一依賴
- 第二依賴test不傳遞依賴
- 第二依賴provided只傳遞provided
- 第二依賴runtime對compile第一依賴的傳遞依賴是runtime

依賴調節

常遇到的問題是,有不同版本的包,他們都存在傳遞性依賴,如下
a->b->c->x(1.0)
a->b->x(2.0)
那么此時,根據maven依賴調節第一原則最短路徑的規則,使用的x包的版本是2.0,如果當2個不同版本的包的依賴相同怎么辦?這個時候就啟動了第二原則,也就是按pom中聲明的順序,誰先被聲明,誰優先的策略去選擇包。

可選依賴

假設有 a->b,b->x和 b->y的 optional值都是true,那么a對於x和y的依賴不會被傳遞,如果a想要使用x或y的包,那么需要在a中重新進行依賴


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM