2011-06-08 206 views
9

在一個大的Maven 2項目中,讓依賴管理確保在整個系統中只使用一個版本的依賴關係是很不錯的。這使得系統一致。清理Maven依賴關係管理

但是當我生成有效的POM時,我沒有機會看到依賴版本來自哪裏。同樣,在層次結構頂部的POM中,我不知道在子POM中的哪個位置真正使用了定義的依賴關係管理部分。

那麼如何保持依賴關係管理的清理?當我在一個項目中刪除一個依賴項時,我總是檢查所有其他項目是否仍然需要它,以便我還可以從頂層的依賴項管理中刪除它?

此外,我如何建立依賴管理,確保它不重複在子POM中的某處?當我添加依賴關係時,我總是檢查所有其他項目,看它是否可能在依賴管理中聚集在頂層。或者你是否總是將所有依賴版本從頭開始移到頂端,這樣他們總是隻在一個地方?

感謝您的任何想法。

+0

另一個想法我剛:爲什麼不通過所有模塊都使用相同的版本號,並依靠$ {} project.version儘可能多地。理想情況下,我只在頂部POM中使用版本號,並在其他地方使用變量。就像我不需要依賴管理一樣,所有內部依賴版本都是直接用變量指定的。 – anselm 2011-06-09 12:40:29

回答

2

如果您使用的是eclipse,m2eclipe插件允許您查看您的pom的依賴關係層次結構。當試圖確定何處將依賴關係帶入您的項目以及發生衝突時,這可能非常有用。

1

除非在所有項目中都使用它,否則您應該在使用它們的項目中顯式聲明依賴項。例如,如果Spring用於所有項目,則將其放入父POM中。如果僅在某些項目中使用它,則在每個項目中聲明它並在父項中放置一個spring.version屬性,每個子項都可以使用它的版本。

將所有依賴關係移至父項時,將從每個項目中移除責任以管理其自己的依賴項。我會認爲這是對maven的濫用,因爲它會讓事情變得更加困難而不是簡單。它現在將依賴關係添加到不需要它們的項目中。項目的依賴項範圍通常也不同,除非您在本地聲明您的依賴項,否則您無法管理它。

+0

我看不到在依賴管理或屬性中指定版本的區別。不要將依賴關係轉移到父依賴管理,因爲缺點是將版本號傳播到整個應用程序中,很容易導致在整個應用程序中出現多個版本的依賴關係。 – anselm 2011-06-09 12:34:06

+0

這就是您使用財產的原因。然後,您的依賴項將在項目的本地進行管理,但該屬性將定義要使用的已接受版本。唯一需要注意的是,任何添加到孩子pom的人都必須意識到這些屬性的存在並適當地使用它們。這仍然比您的提議更可取,即基本上爲每個項目的所有依賴關係提供每個其他項目的依賴關係。它也幾乎迫使你把它們都作爲編譯範圍。 – Robin 2011-06-09 14:45:08

8

您可以爲您的項目創建一個或多個boms(材料清單)。這些pom.xmls將在dependencyManagement部分中聲明項目中使用的所有依賴項。

在每個子pom中,您都會導入這些boms並使用項目所需的這些依賴關係。

以這種方式,依賴版本是集中管理的,而同時,每個子pom只使用它需要的那些依賴關係。

Importing Managed Dependencies

BOM項目

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>my.group</groupId> 
    <artifactId>My-Project-Bom</artifactId> 
    <version>1.0</version> 
    <packaging>pom</packaging> 
    <dependencyManagement> 
    <dependencies> 
     <dependency> 
     <groupId>commons-beanutils</groupId> 
     <artifactId>commons-beanutils</artifactId> 
     <version>1.7.0</version> 
     </dependency> 
     ... 
    </dependencies> 
    </dependencyManagement> 
</project> 

兒童項目

<project> 
<modelVersion>4.0.0</modelVersion> 
<groupId>my.group</groupId> 
<artifactId>child1</artifactId> 
<packaging>jar</packaging> 
<name>Child1</name> 
<version>1.0</version> 
<dependencyManagement> 
    <dependencies> 
    <dependency> 
     <groupId>my.group</groupId> 
     <artifactId>My-Project-BOM</artifactId> 
     <version>1.0</version> 
     <type>pom</type> 
     <scope>import</scope> 
    </dependency> 
    </dependencies> 
</dependencyManagement> 
<dependencies> 
    <dependency> 
     <groupId>commons-beanutils</groupId> 
     <artifactId>commons-beanutils</artifactId> 
    </dependency> 
</dependencies> 
... 
</project> 

maven dependency plugin有幾個目標,以幫助您獲得依賴層次。

mvn dependency:list 
mvn dependency:tree 
mvn dependency:analyze 
+0

我不知道的好主意。但是由於我們有一個頂級POM,所有其他POM都是子級,所以我可以在那裏使用依賴管理。我仍然不明白這將如何解決清理依賴管理的問題。 BOM內部的問題將是相同的。 – anselm 2011-06-09 12:28:49

+0

從來不知道這種方法。我喜歡它,因爲它可以讓你控制版本控制,但依賴關係仍然在合適的範圍內被聲明在需要的地方。如果需要,也很容易使用特定版本。 – Robin 2011-06-09 14:50:11

+0

相似的鏈接[是否有一種簡單的方法從maven pom.xml中刪除未使用的依賴關係? [Stack Overflow](http://stackoverflow.com/questions/1517611/is-there-a-simple-way-to-remove-unused-dependencies-from-a-maven-pom-xml) – 2014-01-06 05:39:07

0

你可以得到POM POM到依賴,代碼引用,這導致他們使用Structure101composition perspective。創建一個新的s101項目,鍵入Maven,指定根pom.xml文件,完成(爲嚮導的其餘部分使用默認值),然後選擇合成透視圖(第二個按鈕位於用戶界面左上角的垂直工具欄上)會看到這樣的事情:

Structure101 POM dependency graph