Maven依賴範圍及依賴傳遞

Java_nick_chan發表於2017-03-08

一: 依賴範圍scope

共5種,compile (編譯)、test (測試)、runtime (執行時)、provided、system

不指定,則依賴範圍預設為compile.

 

compile:編譯依賴範圍,在編譯,測試,執行時都需要。

test: 測試依賴範圍,測試時需要。編譯和執行不需要。如Junit

runtime: 執行時依賴範圍,測試和執行時需要。編譯不需要。如JDBC驅動包

provided:已提供依賴範圍,編譯和測試時需要。執行時不需要。如servlet-api

system:系統依賴範圍。本地依賴,不在maven中央倉庫。

 

 

二:依賴的傳遞

A->B(compile)     第一關係: a依賴b   compile

B->C(compile)     第二關係: b依賴c   compile

 

當在A中配置

<dependency>  
            <groupId>com.B</groupId>  
            <artifactId>B</artifactId>  
            <version>1.0</version>  
</dependency>

則會自動匯入c包。關係傳遞如下表:

 

第一          第二

compile

test

provided

runtime

compile

compile

-

-

runtime

test

test

-

-

test

provided

provided

-

provided

provided

runtime

runtime

-

-

runtime

3.依賴衝突的調節

A->B->C->X(1.0)

A->D->X(2.0)

由於只能引入一個版本的包,此時Maven按照最短路徑選擇匯入x(2.0)

 

A->B->X(1.0)

A->D->X(2.0)

路徑長度一致,則優先選擇第一個,此時匯入x(1.0)

 

4.排除依賴

A->B->C(1.0)

此時在A專案中,不想使用C(1.0),而使用C(2.0)

則需要使用exclusion排除B對C(1.0)的依賴。並在A中引入C(2.0).

 

pom.xml中配置

<!--排除B對C的依賴-->

<dependency>  
            <groupId>B</groupId>  
            <artifactId>B</artifactId>  
            <version>0.1</version>  
            <exclusions>
                 <exclusion>
                    <groupId>C</groupId>  
                    <artifactId>C</artifactId><!--無需指定要排除專案的版本號-->
                 </exclusion>
            </exclusions>
</dependency> 

<!---在A中引入C(2.0)-->

<dependency>  
            <groupId>C</groupId>  
            <artifactId>C</artifactId>  
            <version>2.0</version>  
</dependency> 

 

5.依賴關係的檢視

cmd進入工程根目錄,執行  mvn dependency:tree

會列出依賴關係樹及各依賴關係

 

mvn dependency:analyze    分析依賴關係

相關文章