• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
思想人生从关注生活开始
博客园    首页    新随笔    联系   管理    订阅  订阅

译自如何将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历史中解除。

posted @ 2016-01-07 13:41  JackYang  阅读(2320)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3