译自如何将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:tree或gradle 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历史中解除。
译自如何将Spring Cloud应用程序从Spring Boot 1.2迁移到1.3的更多相关文章
- 微服务领域是不是要变天了?Spring Cloud Alibaba正式入驻Spring Cloud官方孵化器!
引言 微服务这个词的热度自它出现以后,就一直是高烧不退,而微服务之所以这么火,其实和近几年互联网的创业氛围是分不开的. 与传统行业不同,互联网企业有一个特点,那就是市场扩张速度非常之快,可能也就是几天 ...
- spring cloud (一):大话 Spring Cloud
转自:http://www.ityouknow.com/springcloud/2017/05/01/simple-springcloud.html 研究了一段时间Spring Boot了准备向Spr ...
- Spring Cloud Hoxton正式发布,Spring Boot 2.2 不再孤单
距离Spring Boot 2.2.0的发布已经有一个半月左右时间,由于与之匹配的Spring Cloud版本一直没有Release,所以在这期间碰到不少读者咨询的问题都是由于Spring Boot和 ...
- 一起来学spring Cloud | 第一章:spring Cloud 与Spring Boot
目前大家都在说微服务,其实微服务不是一个名字,是一个架构的概念,大家现在使用的基于RPC框架(dubbo.thrift等)架构其实也能算作一种微服务架构. 目前越来越多的公司开始使用微服务架构,所以在 ...
- Spring Boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring Boot,属于依赖的关系。
Spring Boot 是 Spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务,Spring Cloud是一个基于Spring Boot实现的云应用开发工具:Spr ...
- 微服务与Spring Cloud基本概念、Spring Cloud版本命名方式与版本选择
微服务是什么?Spring Cloud是什么?Spring Cloud版本命名方式?Spring Cloud版本选择? 一.微服务是什么 微服务是一种架构风格,是一种将单体应用开发为一组小型服务的方法 ...
- spring cloud 2.x版本 Spring Cloud Stream消息驱动组件基础教程(kafaka篇)
本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka-ri ...
- spring cloud:服务网关 Spring Cloud GateWay 入门
Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使用的 Zuul(1.x) 它有哪些优势呢?Zuul(1.x) 基于 Servlet,使 ...
- Spring Cloud认知学习(一):Spring Cloud介绍与Eureka使用
目录 Spring Cloud的介绍 微服务的介绍 Spring Cloud出现的原因: 常见场景: 微服务的优劣势: Spring Cloud版本问题 版本介绍 与Spring Boot版本对应关系 ...
随机推荐
- XA: 事务和两阶段提交
本文原文连接:http://blog.csdn.net/bluishglc/article/details/7612811 ,转载请注明出处! 1.XA XA是由X/Open组织提出的两阶段提交协议, ...
- 加密算法比较3DES AES RSA ECC MD5 SHA1等
加 密算法通常分为对称性加密算法和非对称性加密算法,对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行 加解密了.非对称算法与之不同,发送双方A,B事先均 ...
- cpu信息查看
# 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| ...
- delphi 过滤开头 结尾 全部 空格的函数
function TrimAnsi(const S: AnsiString): Ansistring; var I, L: Integer; begin L := Length(S); I := ; ...
- 国内代码托管平台(Git)
可以说GitHub的出现完全颠覆了以往大家对代码托管网站的认识.GitHub不但是一个代码托管网站,更是一个程序员的SNS社区.GitHub真正迷人的是它的创新能力与Geek精神,这些都是无法模仿的. ...
- docker容器中的peewee如何连接已有的容器中的数据库
首先,两个容器必须是在同一网络下,有2个办法. 一个是在同一个docker-compose.yml文件下使用links参数,比如: version: '3' services: redis: imag ...
- 第二节:创建模型,使用Code First,配置映射关系
这一节,实现模型的创建,配置映射关系 使用Code First数据迁移. 创建模型 一,首先创建几个接口:实体接口,聚合根接口,值对象接口 1,实体接口: 2,聚合根接口: 3,值对象接口: 二,模型 ...
- ffplay源码分析5-图像格式转换
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10311376.html ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg ...
- Jmeter_前端RSA加密下的登陆模拟_引用js文件实现
版权声明:本文为博主原创文章,未经博主允许不得转载. 在一次项目实战中,前端登录使用了RSA加密,使用LoadRunner压测的第一步,就是模拟用户登录,可惜loadRunner11并不能录制前端的加 ...
- django 中 Oauth2 实现第三方登陆
django 中 Oauth2 实现第三方登陆 python网站第三方登录,social-auth-app-django模块, social-auth-app-django模块是专门用于Django的 ...