譯自如何將Spring Cloud應用程序從Spring Boot 1.2遷移到1.3


前言

筆者第三個Spring Cloud(版本為Spring Boot 1.2)類項目升級最新版本時遇到不少問題,本文內容是作者翻譯Spring Cloud官網一位國外友人文章產生。

原文地址:

Migrating Spring Cloud Apps from Spring Boot 1.2 to 1.3 

作者:DAVE SYER

正文

Spring Boot 1.3中有一些有趣的新功能,現在可以在Brixton版本系列的Spring Cloud中使用。Spring Cloud的Angel版本系列與Spring Boot 1.3部分不兼容,因此在升級時需要注意一些重要事項。本文可幫助您更改並更新任何現有應用程序以使用新功能。在嘗試將新版本的Spring項目引入現有代碼庫時,它通常也會有所幫助。

提示:您可以使用mvn dependency:treegradle dependencies列出項目中的依賴項並檢查版本。

依賴管理

如果你使用的是舊版本的Spring Boot,你可能在你的Maven POM中有這樣的東西:

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.2.7.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent>

要么

<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.2.7.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

或者,如果您使用的是Gradle,

buildscript { ext { springBootVersion = '1.2.7.RELEASE' } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } }

要升級到Spring Boot 1.3.0,您可以將上面的“1.2.7”更改為“1.3.0”。到目前為止這么簡單。

提示:要查看具有最新版Spring Boot的“典型”Maven POM,您可以curl start.spring.io/pom.xml要添加Spring Cloud,您可以添加-d style=cloud-config-client可以通過添加-d bootVersion=1.3.1.BUILD-SNAPSHOT(例如)來更改Spring Boot版本為Gradle使用build.gradle而不是pom.xml

使用Spring Cloud和Spring Boot

由於Spring Cloud構建在Spring Boot之上,因此很難找到可以協同工作的組合。在下文中,我們將介紹幾個升級場景,並展示您可以通過依賴關系管理實現的目標。

大升級

通常,最大的變化是升級時(Spring Boot 1.2升級到1.3,或者Spring Cloud Angel升級到Brixton)。如果您從Spring Initializr下載了一個項目,那么它將使用Spring Boot父POM:

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.2.7.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>

和部分中的Spring Cloud BOM <dependencyManagement>

<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Angel.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

在Gradle中你會看到這樣的東西:

buildscript { ext { springBootVersion = '1.2.7.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-starter-parent:Angel.SR4" } }

在任何一種情況下簡單地更新Spring Boot版本都不會起作用,因為Spring Cloud Angel BOM具有舊版本的Spring Boot和Spring(以及其他內容)。因此,我們確實需要升級Spring Boot和Spring Cloud。例如在Maven中:

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Brixton.M3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

在Gradle:

buildscript { ext { springBootVersion = '1.3.0.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-starter-parent:Brixton.M3" } }

注意:Brixton.M2​​和所有早期版本的Spring Cloud 與Spring Boot 1.3.0.RELEASE 兼容。你至少需要Brixton.M3。

升級超越1.3.0的Spring Boot

假設您要使用Spring Boot快照,或者在發布時升級到1.3.1,但Spring Cloud沒有明確依賴於您想要的Boot版本的版本。

在Maven中,請記住,如果您使用其中包含的現成父POM之一<dependencyManagement>並將優先使用。考慮到這一點,如果您使用這些父POM,請確保使用具有最接近所需依賴關系的父級(在此方案中為Boot one)。

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.1.BUILD-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Brixton.M3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

在Gradle中,事情原則上更簡單,因為沒有“父母”的概念。實際上,Spring Boot插件不能使用與依賴項管理不同的版本,除非您也手動應用依賴項管理插件。所以你必須在以下方面做一點舞蹈build.gradle

buildscript { ext { springBootVersion = '1.3.0.RELEASE' } repositories { mavenCentral() } dependencies { classpath "io.spring.gradle:dependency-management-plugin:0.5.3.RELEASE" classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: "io.spring.dependency-management" ... dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-starter-parent:Brixton.M3" mavenBom "org.springframework.bootspring-boot-starter-parent:1.3.1.BUILD-SNAPSHOT" } } apply plugin: 'spring-boot'

規則是你必須a)手動導入依賴管理插件,然后在Spring Boot 插件之前,b)dependencyManagement 應用Spring Boot插件之前聲明一旦你這樣做,你可以列出dependencyManagement聲明中的依賴項,最后一個獲勝(與Maven相反)。

注意:這種對聲明順序的敏感性是當前版本工具的“特征”。在將來的版本中可能會有所不同。有關詳細信息,請參閱Gradle工具中的此問題

將Maven與自定義父級一起使用

如果您不使用現成的父POM,您可以自由使用包含的POM <dependencyManagement>,這使事情更容易控制。在這種情況下,您需要將Spring Boot和Spring Cloud都放入其中<dependencyManagement>並且順序非常重要:第一個獲勝(Gradle的最后一個)。例如,在Maven中使用Spring Boot 1.3.1.BUILD-SNAPSHOT和Spring Cloud Brixton.M3:

<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.1.BUILD-SNAPSHOT</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>Brixton.M3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

BOM的順序

請注意,在Maven和Gradle中,BOM的順序非常重要:如果頂層存在沖突(顯式聲明的依賴關系),則首先聲明的那個通常在Maven中獲勝(Gradle中的最后一個)。與Maven的一個重大區別是父母是特殊的:如果它包含<dependencyManagement>它總是獲勝。

要了解特定的依賴版本是否會以您需要的方式解析,這很復雜。它取決於BOM的順序,以及傳遞依賴關系樹中聲明依賴關系的深度。例如,Spring Boot BOM聲明了一個顯式(級別1)依賴關系管理,spring-core但沒有聲明任何其他Spring Framework jar(通過對Spring Framework BOM的引用引入)。規則是第一次聲明獲勝,但是包括整個樹(包括所有BOM),從頂部逐層搜索。

注意:沒有Spring Boot(或Spring Dependency Management)插件,Gradle沒有這個“最后一個勝利”規則。要使用“本機”Gradle構建做同樣的事情,通常需要手動修復傳遞依賴版本的細致而繁瑣的工作。

進一步操縱依賴版本

如果您希望將依賴項版本超出Spring Boot和Spring Cloud BOM中指定的版本,那么事情就會變得復雜。從廣義上講,有兩個選項:屬性和其他BOM。第一個(屬性)與現成的父POM一起工作,而另一個不工作。第二(更BOM表)只有在有工作可供你有興趣,並且僅當傳遞依賴不符合您的要求相沖突的相關性的BOM。例如,所有Spring Cloud項目都有自己的BOM,就像Spring Framework一樣,所以這是一個開始。

屬性

Spring Boot父POM(如果您使用它,則使用Spring Cloud,因為它繼承自Boot one)將其所有依賴版本提取出來<properties/>因此,您通常只需更改屬性值即可。Maven中的示例:

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <spring.version>4.2.4.BUILD-SNAPSHOT</spring.version> </properties>

Gradle中的相應功能是ext屬性,例如

ext['spring.version'] = '4.2.4.BUILD-SNAPSHOT'

其他物料清單

Spring Framework有自己的BOM,因此我們可以使用它來管理Spring版本。在Maven中使用自定義父級(不包含<dependencyManagement>):

<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>4.2.4.BUILD-SNAPSHOT</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

注意:此示例實際上不適用於Spring Boot父POM(除非碰巧具有相同的<spring.version/>),因為Spring框架版本已由父級修復。要將Spring Boot父級與Spring Framwork快照一起使用,最好使用屬性方法(上面)。

在Gradle中它更簡單(因為沒有父設置沖突版本):

dependencyManagement { imports { mavenBom "org.springframework:spring-framework-bom:4.2.4.BUILD-SNAPSHOT" mavenBom "org.springframework.boot:spring-boot-starter-parent:1.3.0.RELEASE" } }

結論

依賴管理很難,但希望我們通過概述升級Spring Boot和Spring Cloud的幾個常見場景來緩解這一打擊。根據您是選擇Maven還是Gradle,有一些略有不同的行為,但至少如果您選擇Gradle並使用Spring Boot插件,則差異會最小化。在一天結束時,Spring項目有不同的發布時間表,所以總會有沖突,但它們通常總是會趨向收斂,所以如果等待的時間足夠長,事情就會平等。像Spring Cloud,Spring Boot和Spring IO Platform這樣的Umbrella項目也有助於消除顛簸:如果你可以使用其中一個來管理所有依賴項,那么事情會變得更加簡單。

Spring指南中的示例應用程序現已全部更新到Spring Boot 1.3,即使這意味着它們依賴於Spring Cloud的里程碑(這僅適用於Zuul代理示例)。許多人不再需要Spring Cloud了。如果您需要GA版本的Spring Cloud,您需要立即使用Spring Boot 1.2。該組合的樣本可以從git歷史中解除。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM