2012-05-04 47 views
2

我發現了Maven依賴項插件提供的有趣功能。我分析了我的一個項目,並得到以下輸出:Maven使用但未聲明的依賴項

[WARNING] Used undeclared dependencies found: 
[WARNING] org.apache.geronimo.specs:geronimo-javamail_1.4_spec:jar:1.6:compil 
e 
[WARNING] javax.xml.soap:saaj-api:jar:1.3:compile 
[WARNING] org.apache.geronimo.specs:geronimo-annotation_1.0_spec:jar:1.1.1:co 
mpile 
[WARNING] org.apache.geronimo.specs:geronimo-jaxws_2.1_spec:jar:1.0:compile 
[WARNING] org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.1.Fin 
al:compile 
[WARNING] org.apache.geronimo.specs:geronimo-ws-metadata_2.0_spec:jar:1.1.2:c 
ompile 
[WARNING] Unused declared dependencies found: 
[WARNING] junit:junit:jar:4.5:test 
[WARNING] log4j:apache-log4j-extras:jar:1.1:compile 
[WARNING] org.slf4j:slf4j-log4j12:jar:1.6.4:compile 
[WARNING] org.slf4j:slf4j-api:jar:1.6.4:compile 
[WARNING] org.hibernate:hibernate-c3p0:jar:3.6.8.Final:runtime 

「未使用的聲明」部分對我來說很明顯。關於「未使用的未聲明」部分,它向我展示了我的項目直接使用的依賴關係,但是它被Maven傳遞包含在類路徑中。

讓我們以第一個例子「org.apache.geronimo.specs:geronimo-javamail_1.4_spec:jar:1.6:compile」爲例,這個依賴包含在內,因爲它依賴於cxf-rt-core-2.2 0.6。但是,JAR中的代碼也可以直接用於項目。我現在想知道,在編寫這個項目時,開發人員可能有意使用另一個Java Mail JAR。

如果我想在我的一個項目中使用CXF 2.2.6,我會自動獲取Geronimo提供的Java Mail規範作爲傳遞依賴項。如果我想使用另一個Java Mail API呢?通過查找search.maven.org,我可以看到許多JAR提供了Java Mail API。

感謝

回答

1

如果要排除特定的傳遞性依賴,你可以使用exclusions for dependencies

<dependency> 
    <groupId>...</groupId> 
    <artifactId>..</artifactId> 
    <version>..</version> 
    <exclusions> 
    <exclusion> 
     <groupId>sample.ProjectB</groupId> 
     <artifactId>Project-B</artifactId> 
    </exclusion> 
    .. 
    </exclusions> 
</dependency> 

這隻適用於第一級傳遞依賴。

+0

我知道這個解決方案存在。正如你所說,只有第一級的傳遞依賴纔有可能。所以,如果我使用依賴於geronimo-javamail-spec的B的項目A,我不得不使用它,並且我不能在我的類路徑中包含另一個Java Mail API? –

+0

對不起。不要只是將B添加爲直接依賴並排除它。導致依賴關係的最短路徑獲勝。 – khmarbaise

+0

謝謝。但是,總的來說,在這種情況下做出什麼決定?使用Geronimo依賴關係就足夠了? –

1

程序員很可能會忽略檢查Java Mail API jar的版本 - 這正是「使用未聲明的依賴關係」警告的原因。您應該通過在主POM中添加依賴項作爲直接依賴項進行修復。使用當前工作的版本(因爲它是傳遞的),不用擔心原程序員的意圖 - 他們可能根本就沒有考慮過。

然後,如果傳遞版本以突破方式進行更改,則您的項目應該是正常的,因爲它是直接列出的。