讀古今文學網 > Maven實戰 > 5.6.2 傳遞性依賴和依賴範圍 >

5.6.2 傳遞性依賴和依賴範圍

依賴範圍不僅可以控制依賴與三種classpath的關係,還對傳遞性依賴產生影響。上面的例子中,account-email對於spring-core的依賴範圍是compile,spring-core對於commons-logging的依賴範圍是compile,那麼account-email對於commons-logging這一傳遞性依賴的範圍也就是compile。假設A依賴於B,B依賴於C,我們說A對於B是第一直接依賴,B對於C是第二直接依賴,A對於C是傳遞性依賴。第一直接依賴的範圍和第二直接依賴的範圍決定了傳遞性依賴的範圍,如表5-2所示,最左邊一行表示第一直接依賴範圍,最上面一行表示第二直接依賴範圍,中間的交叉單元格則表示傳遞性依賴範圍。

表5-2 依賴範圍影響傳遞性依賴

為了能夠幫助讀者更好地理解表5-2,這裡再舉個例子。account-email項目有一個com.icegreen:greenmail:1.3.1b的直接依賴,我們說這是第一直接依賴,其依賴範圍是test;而greenmail又有一個javax.mail:mail:1.4的直接依賴,我們說這是第二直接依賴,其依賴範圍是compile。顯然javax.mail:mail:1.4是account-email的傳遞性依賴,對照表5-2可以知道,當第一直接依賴範圍為test,第二直接依賴範圍是compile的時候,傳遞性依賴的範圍是test,因此javax.mail:mail:1.4是account-email的一個範圍是test的傳遞性依賴。

仔細觀察一下表5-2,可以發現這樣的規律:當第二直接依賴的範圍是compile的時候,傳遞性依賴的範圍與第一直接依賴的範圍一致;當第二直接依賴的範圍是test的時候,依賴不會得以傳遞;當第二直接依賴的範圍是provided的時候,只傳遞第一直接依賴範圍也為provided的依賴,且傳遞性依賴的範圍同樣為provided;當第二直接依賴的範圍是runtime的時候,傳遞性依賴的範圍與第一直接依賴的範圍一致,但compile例外,此時傳遞性依賴的範圍為runtime。