Maven依賴範圍與classpath、依賴傳遞

配置Junit依賴時,我們這樣配置:

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

其中的scope就是依賴範圍,依賴範圍作用於classpath。依賴範圍與三種classpath關係如下:

依賴範圍與classpath的關係
依賴範圍(scope) 對於編譯classpath有效 對於測試classpath有效 對於運行時classpath有效 例子
compile(默認) Y Y Y Spring-core
test -- Y -- Junit
provided Y Y -- servlet-api
runtime -- Y Y JDBC驅動實現
system Y Y --

本地的,Maven倉庫之外的類庫文件

Maven依賴範圍不僅控制依賴與classpath的關係,還會影響依賴傳遞。

最左邊一列表示第一直接依賴範圍,最上面一行表示第二直接依賴範圍,中間的交叉單元格則表示傳遞性依賴範圍。

依賴範圍與依賴傳遞的關係
  compile test provided runtime
compile compile --- --- runtime
test test --- --- test
provided provided --- provided provided
runtime runtime --- --- runtime

仔細觀察上面表格,我們發現這樣的規律:

 
  • 當第二直接依賴的範圍是compile的時候,傳遞性依賴的範圍與第一直接依賴的範圍一致;
  • 當第二直接依賴的範圍是test的時候,依賴不會得以傳遞;
  • 當第二直接依賴的範圍是provided的時候,只傳遞第一直接依賴的範圍也爲provided的依賴,切傳遞性依賴的範圍同樣爲provided;
  • 當第二直接依賴的範圍是runtime的時候,傳遞性依賴的範圍與第一直接依賴的範圍一致,但compile例外,此時傳遞性依賴的範圍爲runtime。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章