覆蓋 Spring Boot 管理的依賴版本

一、簡介

Spring Boot 是快速啟動新項目的優秀框架。它幫助開發人員快速創建新應用程序的方法之一是定義一組適合大多數用戶的依賴項。

但是,在某些情況下,可能需要覆蓋一個或多個依賴項版本

在本教程中,我們將了解如何覆蓋 Spring Boot 託管依賴項及其版本。

2. Spring Boot 物料清單 (BOM)

我們先來看看 Spring Boot 是如何管理依賴的。簡而言之,Spring Boot 使用物料清單 (BOM) 來定義依賴項和版本。

大多數 Spring Boot 項目繼承自spring-boot-starter-parent 工件,它本身繼承自spring-boot-dependencies工件。後一個工件是 Spring Boot BOM ,它只是一個帶有大dependencyManagement部分的 Maven POM 文件:

<dependencyManagement>
 <dependencies>
 <dependency>
 ...
 </dependency>
 <dependency>
 ...
 </dependency>
 </dependencies>
 </dependencyManagement>

通過使用 Maven 的dependencyManagement如果我們的應用程序選擇使用它們,BOM 可以指定默認庫版本。讓我們看一個例子。

Spring Boot BOM 中的條目之一如下:

<dependency>
 <groupId>org.apache.activemq</groupId>
 <artifactId>activemq-amqp</artifactId>
 <version>${activemq.version}</version>
 </dependency>

這意味著項目中依賴 ActiveMQ 的任何工件都將默認獲得此版本。

另外,請注意版本是使用屬性 placeholder 指定的。這是 Spring Boot BOM 中的常見做法,它在自己的properties部分中為這個和其他屬性提供值。

3. 覆蓋 Spring Boot 管理的依賴版本

現在我們了解了 Spring Boot 如何管理依賴版本,讓我們看看我們可以覆蓋它們。

3.1.馬文

對於 Maven,我們有兩個選項可以覆蓋 Spring Boot 管理的依賴項。首先,對於 Spring Boot BOM 使用屬性佔位符指定版本的任何依賴項,我們只需要在我們的項目 POM 中設置該屬性

<properties>
 <activemq.version>5.16.3</activemq.version>
 </properties>

這將導致任何使用activemq.version屬性的依賴項使用我們指定的版本,而不是 Spring Boot BOM 中的版本。

此外,如果版本dependency標記中明確指定而不是作為佔位符,那麼我們可以簡單地在項目依賴項條目中明確version

<dependency>
 <groupId>org.apache.activemq</groupId>
 <artifactId>activemq-amqp</artifactId>
 <version>5.16.3</version>
 </dependency>

3.2.Gradle

Gradle 需要一個插件來支持來自 Spring Boot BOM 的依賴管理。因此,要開始,我們必須包含插件並導入 BOM:

apply plugin: "io.spring.dependency-management"
 dependencyManagement {
 imports {
 mavenBom 'io.spring.platform:platform-bom:2.5.5'
 }
 }

現在,如果我們想覆蓋特定版本的依賴項,我們只需要將 BOM 中的相應屬性指定為 Gradle ext屬性:

ext['activemq.version'] = '5.16.3'

並且如果BOM中沒有要覆蓋的屬性,我們總是可以在聲明依賴時直接指定版本:

compile 'org.apache.activemq:activemq-amqp:5.16.3'

3.3.注意事項

這裡有幾個警告值得一提。

首先,重要的是要記住 Spring Boot 是使用其 BOM 中指定的庫版本構建和測試的。每當我們指定不同的庫版本時,就有可能引入不兼容的風險。因此,每當我們偏離標準依賴版本時,都必須測試我們的應用程序。

另外,請記住,這些技巧僅適用於我們使用 Spring Boot 材料清單 (BOM) 的情況。對於 Maven,這意味著使用 Spring Boot 父級。對於 Gradle,這意味著使用 Spring 依賴項插件。

4. 查找依賴版本

我們已經看到 Spring Boot 如何管理依賴版本以及我們如何覆蓋它們。在本節中,我們將了解如何找到項目正在使用的庫的版本。這對於識別庫版本和確認我們應用於項目的任何覆蓋都得到遵守非常有用。

4.1.Maven

Maven 提供了一個目標,我們可以使用它來顯示所有依賴項及其版本的列表。例如,如果我們運行以下命令:

mvn dependency:tree

我們應該看到類似於以下內容的輸出:

[INFO] org.1ju:dependency-demo:jar:0.0.1-SNAPSHOT
 [INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.5.7-SNAPSHOT:compile
 [INFO] | +- org.springframework.boot:spring-boot-starter:jar:2.5.7-SNAPSHOT:compile
 [INFO] | | +- org.springframework.boot:spring-boot:jar:2.5.7-SNAPSHOT:compile
 [INFO] | | +- org.springframework.boot:spring-boot-autoconfigure:jar:2.5.7-SNAPSHOT:compile
 [INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:2.5.7-SNAPSHOT:compile
 [INFO] | | | +- ch.qos.logback:logback-classic:jar:1.2.6:compile
 [INFO] | | | | \- ch.qos.logback:logback-core:jar:1.2.6:compile

輸出顯示作為項目依賴項的所有工件和版本。這些依賴關係以樹狀結構呈現,便於識別每個工件是如何導入到項目中的。

在上面的例子中, logback-classic工件是spring-boot-starter-logging庫的一個依賴,它本身是spring-boot-starter模塊的一個依賴。因此,我們可以向上導航回到我們的頂級項目。

4.2. Gradle

Gradle 提供了一個生成類似依賴樹的任務。例如,如果我們運行以下命令:

gradle dependencies

我們將得到類似於以下內容的輸出:

compileClasspath - Compile classpath for source set 'main'.
 \--- org.springframework.boot:spring-boot-starter-web -> 1.3.8.RELEASE
 +--- org.springframework.boot:spring-boot-starter:1.3.8.RELEASE
 | +--- org.springframework.boot:spring-boot:1.3.8.RELEASE
 | | +--- org.springframework:spring-core:4.2.8.RELEASE
 | | \--- org.springframework:spring-context:4.2.8.RELEASE
 | | +--- org.springframework:spring-aop:4.2.8.RELEASE

就像 Maven 輸出一樣,我們可以輕鬆識別為什麼每個工件都被拉入項目,以及使用的版本。

5. 結論

在文章中,我們學習了 Spring Boot 如何管理依賴版本。我們還看到瞭如何在 Maven 和 Gradle 中覆蓋這些依賴版本。最後,我們看到瞭如何驗證兩種項目類型中的依賴項版本。