2013-03-02 65 views
4

我試圖定義在pom.xml中的數據時遵循最佳實踐,所以我開始尋找到Spring源代碼,我已經看到:行家 - 傳遞依賴


<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId&gtorg.springframework</groupId> 
    <artifactId&gtspring-aop</artifactId> 
    <packaging&gtjar</packaging> 
    <version&gt3.1.1.RELEASE</version> 
..... 

<dependency> 
     <groupId&gtorg.springframework</groupId> 
     <artifactId&gtspring-beans</artifactId> 
     <version>${project.version}</version> 
     <scope&gtcompile</scope> 
</dependency> 

--- 

<dependency> 
     <groupId&gtlog4j</groupId> 
     <artifactId>log4j</artifactId> 
     <scope&gttest</scope> 
</dependency> 
----- 

但是,彈簧豆也依賴於log4j。

對於最佳實踐方法,您可以告訴我,您應該在多大程度上依賴傳遞性依賴?

我在問這個,因爲我的第一個想法是不重新聲明log4j依賴項,因爲spring-beans已經聲明瞭它。

回答

9

聲明您明確依賴的依賴關係,無論它是否提供直接導入和使用的類,還是提供您直接使用的服務(如Log4J)。傳遞依賴只應該提供運行時需要的依賴關係,但不要使用自己。

1

有兩個部分本:

log4j的是申報「測試」範圍,也不會確定輸入(JAR /戰爭......)的一部分。所以,當spring-beans依賴log4j進行測試(範圍)時,這並不意味着對於在提供的或運行時(範圍)使用spring-beans的項目,存在傳遞依賴項

依賴範圍 - 這允許您只包含適合當前構建階段的依賴關係。 ...測試: 此範圍指示正常使用應用程序時不需要依賴關係,並且僅適用於測試編譯和執行階段。 (Apache)的

第二部分是:

當依賴項的版本是未指定,則它依賴於「其他」 POM用於管理的依賴。所以依賴關係是可傳遞的並由其他人管理。 「依賴管理」

依賴管理 - 這使得項目的作者可以直接指定工件時,他們傳遞依賴或在沒有版本已經被指定的依賴遇到要使用的版本。 (阿帕奇)

Maven Apache transitive dependency

+1

devBinnoh嗨,關於「log4j的是申報‘測試’的範圍,也不會敲定輸出(JAR /戰爭......)的一部分。因此,當彈簧bean依賴log4j進行測試(範圍),這並不意味着在提供的或運行時(範圍)使用spring-beans的項目存在傳遞依賴性。「:我已經檢查過,如果依賴於事實junit依賴是傳遞性的......對於spring的用法,這可能是其他一些解釋嗎? – Roxana 2013-03-03 18:02:18

+0

是的,你說得對。在這種情況下,Log4j依賴於傳遞依賴。爲什麼?!第二部分是通過「依賴管理」實現的傳遞依賴。當你「不指定」依賴的版本號時,你依靠「其他」來指定它,因此它是函數依賴。 我的答案的第一部分是指出這些依賴關係的範圍,知道範圍只能在其範圍上傳遞。但是,對於春天,我認爲第二部分適用。 – devBinnooh 2013-03-04 16:19:03