2015-10-22 39 views
2

在我的項目中,我使用的模塊爲M1,它使用庫A。該庫依賴於庫B。我想用庫B確保Maven中的一致性依賴關係版本

當然,我有「根」模塊,這取決於我所有的模塊,因此庫B版本應該在所有項目中都是相同的。

因此,我添加了B來依賴我的M2模塊,但不知道如何指定它的版本,因爲我需要與庫A使用完全相同的版本。

如果我指定庫B的當前版本,然後,當我將升級庫A到新版本,我會忘記我的模塊中更新的B版本。

另外我不想把A作爲M2的依賴關係,因爲我只需要其功能的有限部分。

我的情況最佳做法是什麼?

回答

2

Maven的執行插件可以打破建立上述版本是否偏離,這樣喲不要忘記更新:看https://maven.apache.org/enforcer/enforcer-rules/dependencyConvergence.html

+0

一起使用這樣做是否也兼有傳遞和直接依賴關係?因爲我們在這裏有:'M1'→'A'→'B','M2'→'B'。 –

+0

不確定,對不起。 –

+0

我認爲這是最好的解決方案。不幸的是我不能使用它,因爲我使用的一個庫已經存在使用依賴關係一致性的問題。 – talex

1

有幾種選擇他們中的一些你明確地排除在外。讓我提他們完整起見反正:

  1. 包括BM2依賴。

    • 優勢:對於乾淨的解決方案,以僅添加那些功能M2這實際上是需要的。
    • 缺點:的BM2版必須保持同步於正矢量的B手動A
  2. 包括A作爲依賴M2

    • 優勢:中央<DependencyManagement>可以在父POM中使用。因此,B的版本在所有子項目中始終保持相同。
    • 缺點:在M2中不需要A的功能被添加到M2
  3. 包括M1作爲M2的依賴關係。

    • 優勢M2始終使用的B相同版本的A,而不必應付B作爲依賴的。
    • 缺點:的M1A不需要在M2的功能被添加到M2
  4. 使用<dependency>/.../<exclusion>AM1排除B

    • 優勢:中央<DependencyManagement>可以在父POM中使用。因此,B的版本在所有子項目中始終保持相同。
    • 缺點:版本B必須手動保持與B版本的A同步。

[輸入是歡迎的情況下有什麼事我都沒有想到的。]

通過Assen Kolov in his answer儘量提到Maven Enforcer Plugin's Dependency Convergence。如果它適用於直接和傳遞依賴的混合,就像你的情況一樣,我會將它與1.