源文章:https://blog.csdn.net/honghai…
傳遞性依賴
傳遞性依賴是在maven2中新增的新特徵,這個特徵的作用就是你不需要考慮你依賴的庫檔案所需要依賴的庫檔案,能夠將依賴模組的依賴自動的引入。例如我們依賴於spring的庫檔案,但是spring本身也有依賴,如果沒有傳遞性依賴那就需要我們瞭解spring專案依賴,自己新增到我們的專案中。有了傳遞性依賴機制,在使用Spring Framework的時候就不用去考慮它依賴了什麼,也不用擔心引入多餘的依賴。Maven會解析各個直接依賴的POM,將那些必要的間接依賴,以傳遞性依賴的形式引入到當前的專案中。
假設A依賴於B,B依賴於C,我們說A對於B是第一直接依賴,B對C是第二直接依賴,A對於C是傳遞性依賴。第一直接依賴的範圍和第二直接依賴的範圍決定了傳遞性依賴的範圍。
最左邊一行表示第一直接依賴範圍,最上面一行表示第二直接依賴範圍,中間的交叉單元格則表示傳遞性依賴範圍。
compile | test | provided | runtime | |
compile | compile | — | — | runtime |
test | test | — | — | test |
provided | provided | — | — | provided |
runtime | runtime | — | — | runtime |
仔細觀察上面表格,我們發現這樣的規律:
- 當第二直接依賴的範圍是compile的時候,傳遞性依賴的範圍與第一直接依賴的範圍一致;
- 當第二直接依賴的範圍是test的時候,依賴不會得以傳遞;
- 當第二直接依賴的範圍是provided的時候,只傳遞第一直接依賴的範圍也為provided的依賴,切傳遞性依賴的範圍同樣為provided;
- 當第二直接依賴的範圍是runtime的時候,傳遞性依賴的範圍與第一直接依賴的範圍一致,但compile例外,此時傳遞性依賴的範圍為runtime。
Maven對傳遞性依賴的處理
有些依賴,maven會對其按照下述原理自動處理
1).短路優先:誰離得最近就使用誰的依賴jar包
C到達A為C->B->A
C到達B為C->B
例如:
A中的commons-io的版本為2.4
B中的commons-io的版本為2.0
C中依賴於B,B依賴於A
則C的commons-io的包為2.0版本
因為依賴的短路優先
2).如果兩條路都是一樣長的時候
C到達A為C->A
C到達B為C->B
則看pom檔案中依賴的兩個工程誰在前面就是用哪個版本