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

How to selectively upgrade a dependency in Spring Boot? (sample case: Spring Data)

我使用 Spring Boot (1.4.1) 的 Spring Data JPA starter。它包含 Spring 数据 JPA 1.10.3。但是,我需要使用此版本 spring 数据中尚不存在的 @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:升级到较新版本的 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>

优点

  • 您将自动将所有引导管理的依赖项升级到它们的最新兼容版本。这是明智的,因为这将确保您获得第三方依赖项中安全更新的最新修复

缺点

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

选项 2:单独升级依赖项

先前方法的替代方法是保留您当前使用的引导版本,但有选择地升级第三方依赖项。首选方法是检查 spring-boot-dependencies 中存在哪些版本占位符。然后你只需要在你的项目中重新声明 属性 并调整版本。对于 Spring 数据,即:

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

如果是 Spring 数据,您将在此处立即升级整个发布序列,这样您就不会 运行 进入 Spring 数据模块之间的内部不兼容性,如果您只需升级一个模块。这是建议 "upgrade by property" 而不是明确地在较新版本中重新声明依赖项的主要原因之一(在某些情况下这仍然是最后的手段)。

优点

  • 升级是更具选择性的操作。与以前的方法相比,您不会 运行 冒着升级不相关依赖项问题的风险。

缺点

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

建议的步骤

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

  1. 使用选项 1 进行升级,尽可能减少影响。如果成功:完成。
  2. 如果这会导致问题,请评估用手动配置替换自动配置的难度(通常需要对 Boot 有一定的了解和经验。如果成功:完成。
  3. 使用选项 2 升级到较新版本的 Boot 并评估这对您的应用程序代码的影响。

2 和 3 可以互换,具体取决于您个人的喜好或您为团队定义的依赖项升级策略。

一般来说,密切关注引导版本并定期尝试将项目干升级到较新版本是个好主意,但不一定将升级发布到生产环境。这使您可以评估升级的风险并估计需要为此进行的工作量。 避免升级基本上只会让它们更痛苦,但是,是的,有时由于政治原因或因为升级 运行在较新版本中遇到问题而无法立即进行版本。