如何有选择地升级Spring Boot中的依赖项? (示例案例:Spring Data)

时间:2017-08-30 18:29:58

标签: spring maven spring-boot spring-data-jpa dependency-management

我使用Spring Boot的Spring Data JPA启动程序(1.4.1)。它包含Spring Data JPA 1.10.3。但是,我需要使用此版本弹簧数据中尚不存在的@DomainEvents注释。当我尝试添加最新版本的Spring Data JPA时,我的应用程序运行时会出错。

我的pom例子:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.1.RELEASE</version>
        <relativePath/>
</parent>

<dependencies>
        ...
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        ...
</dependencies>

当我尝试添加最新版本的Spring Data JPA时:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>1.11.6.RELEASE</version>
        </dependency>
    </dependencies>
</dependencyManagement>

当我启动我的应用程序时,我会感到愤怒。像这样的错误:

Caused by: java.lang.NoSuchMethodException: org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.<init>()
  at java.lang.Class.getConstructor0(Class.java:3082) ~[na:1.8.0_121]
  at java.lang.Class.getDeclaredConstructor(Class.java:2178) ~[na:1.8.0_121]
  at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:80) ~[spring-beans-4.3.3.RELEASE.jar:4.3.3.RELEASE]
  ... 53 common frames omitted

如何使用较新版本的Spring Data JPA?我的应用中需要@DomainEvents。谢谢!

1 个答案:

答案 0 :(得分:29)

有多种方法可以让猫在这里皮肤上有所不同的起点和缺点:

选项1:升级到较新版本的Boot

最安全的方法是升级到更新版本的Spring Boot。我们通常建议您使用当前主流的最新版本。在你的情况下,1.5是最近的次要,所以我们建议升级到那个(目前为1.5.6)。这通常只需更改您使用的父pom的版本号即可实现。

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>1.5.6.RELEASE</version>
</parent>

赞成

  • 您将自动将所有Boot托管依赖关系升级到最新兼容版本。这是可取的,因为这将确保您获得第三方依赖项中的安全更新的最新修补程序

缺点

  • 如果您依赖应用程序代码中的第三方API,则次要版本升级可能需要您稍微更改有关配置或API的内容。在不引入第三方库中的更改时,Boot中的次要版本升级通常非常小心,但遗憾的是并非所有版本都遵循语义版本控制。但是,如果你有一个不错的测试套件,你应该很容易发现你是否遇到了问题。建议您查看release notes,因为它们通常包含迁移指南。

选项2:单独升级依赖项

以前方法的替代方法是保留您正在使用的Boot版本,但有选择地升级第三方依赖项。执行此操作的首选方法是检查spring-boot-dependencies中存在哪个版本的占位符。然后,您只需重新声明项目中的属性并调整版本。对于Spring Data,它是:

<properties>
  <spring-data-releasetrain.version>Ingalls-SR6<spring-data-releasetrain.verion>
</properties>

如果是Spring Data,您可以立即升级整个版本系列,这样如果您只是升级一个模块,就不会在内部遇到Spring Data模块之间的不兼容问题。这是&#34;升级财产的主要原因之一&#34;建议明确地在新版本中重新声明依赖关系(在某些情况下仍然是最后的手段)。

赞成

  • 升级更具选择性。与之前的方法相比,您不会冒着遇到无关依赖的升级问题的风险。

缺点

  • 它可能无效! - 有时依赖项会更改Boot的自动配置在次要版本中所依赖的一些内部API。这可能导致自动配置在启动时不起作用,您可以尝试通过明确排除自动配置并编写手动配置来替换。

建议步骤

在实践中,我通常会尝试以下步骤:

  1. 使用选项1以尽可能小的影响进行升级。如果成功:完成。
  2. 如果这会导致问题,请评估用手动配置替换自动配置的难度(通常需要一些洞察力和使用Boot的经验。如果成功:完成。
  3. 使用选项2升级到较新版本的Boot并评估其对您的应用程序代码的影响。
  4. 2和3可能是可以互换的,具体取决于您个人喜欢的内容或您为团队定义的依赖项升级政策。

    一般来说,关注Boot版本是一个好主意,并经常尝试将项目干式升级到新版本,但不一定要将升级版本发布到生产版本。这使您可以评估升级风险并估计需要进行此项工作的工作量。 避免升级基本上只是让他们更痛苦,但是,有时候,由于政治原因或者升级在新版本中遇到问题,他们有时无法立即制作。