深入探討:Maven中的物料清單BOM

Yujiaao發表於2021-09-30

深入探討:Maven中的物料清單

2019年6月4日 阿尤什·普拉沙(Ayush Prashar)Java專案管理材料清單依賴管理MavenMaven外掛

閱讀時間: 3 分鐘

最近,在使用Spring WebFlux時,我遇到了一個非常有用的物料清單概念,也稱為BOM表( bill of materials),這個概念實際上並不僅限於Spring。BOM 是 Spring 幫助我們忘記與傳遞依賴項有關的問題,把注意力放到關注專案需求的幾種方法之一。

因此,當我們通常建立一個具有數十個或數百個依賴項的大型專案時,很大可能使用傳遞性依賴項是在專案內部使用的通用項。因此,假設我們有一個稱為 “common-3.0.0.RELEASE” 的依賴項,它由日誌記錄的工件使用,而測試框架使用的 “common-2.9.0.Release”這個版本。在這種情況下就會有衝突。我們需要確保獲得可用的版本,以便兩個工件可以協同工作。

Maven 有一種為我們解決這個問題的方法。它使用依賴關係調解(dependency mediation)的概念。它用一個被稱為依賴項的路徑的概念。擁有最短專案路徑的包將被其他包選中。假設在我們的例子中,依賴鏈類似於 log4j -> commons-2.9.0.Release 和 JUnit -> unit-tests -> common.3.0.0., Maven 選擇commons 2.9,因為它的依賴路徑距離當前 POM 更短。

但是,當我們可以搞對時,為什麼要依靠某種外部方法呢?通過在 POM 中指定它,我們始終可以使用我們希望的甚至可以過渡的版本。當然,但這會使我們的 POM 混亂,因為我們要寫入的可能會很多。 我們可以讓依賴管理(dependency management )來控制,也許是一個更好的辦法。

物料清單

Maven 讓我們在單獨的 pom 中定義依賴項或傳遞性依賴項的版本。在此 pom 中,我們宣告瞭依賴項的版本和範圍。因此,我們可以集中討論所有依賴項細節。

讓我們建立一個示例物料清單 pom 檔案。

2019-06-04 15-08-09的螢幕截圖

可以看出,物料清單是一個完全正常的 POM 檔案,我們可以在其中包含依賴項資訊。

如何使用它?

現在我們瞭解到,BOM是一個檔案,其中包含有關我們專案的任何依賴項版本的所有資訊。下一步是將此檔案包含在我們的原始POM中。

一種做到這一點的方式就是Spring的方式,就像父專案一樣繼承它。我們需要做的就是在父標記中提供父資訊。

2019-06-04 15-09-21的螢幕截圖

儘管這是 Spring 的工作方式,但我們不能從多個父pom繼承。因此,如果您希望從多個繼承,我們會在依賴項中傳遞憑據。

2019-06-04 15-03-57的螢幕截圖

優先順序

因此,有多種確定版本的方法,這意味著有一個優先順序。

  1. 在POM中直接宣告中提供的版本具有最高優先順序。
  2. 父pom中提供的版本具有第二優先權。
  3. 匯入的pom版本排名第三
  4. 最後,我們從依賴關係調解中得到的版本

如果在繼承多個 pom 時發生衝突,則按順序更早宣告的依賴項優先。

因此,現在您可以瞭解為什麼在Spring pom中可以進行神奇的自動配置,BOM是什麼, 以及在需要進行指定版本的情況下該怎麼做。

參考:

Maven Doc

Maven基礎

相關文章