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

V.库兹涅佐夫:

我使用Spring Boot(1.4.1)的Spring Data JPA启动程序。它包含Spring Data JPA 1.10.3。但是,我需要使用@DomainEvents此版本的spring数据中尚不存在的注释。当我尝试添加最新版本的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在我的应用程序中。谢谢!

奥利弗·德罗博姆(Oliver Drotbohm):

有多种方法可以为猫皮化,但都有不同的优点和缺点:

选项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中的次要版本升级通常非常小心,但是不幸的是,并非所有更新都遵循语义版本控制。但是,如果您有一个不错的测试套件,那么应该很容易找出是否会遇到问题。建议查看发行说明,因为它们通常包含迁移指南。

选项2:分别升级依赖关系

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

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

如果使用Spring Data,则要在此处一次升级整个发行版,这样,即使您只升级一个模块,也不会在内部遇到Spring Data模块之间的不兼容性。这是建议通过“按属性升级”而不是在显式版本中显式重新声明依赖项的主要原因之一(在某些情况下,后者仍然是最后的选择)。

优点

  • 升级操作更具选择性。与以前的方法相比,您没有冒险遇到不相关的依赖项的升级问题。

缺点

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

建议步骤

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

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

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

一般来说,最好注意Boot版本,并定期尝试将项目干式升级到较新的版本,但不一定要将升级版本交付生产。这样您就可以评估升级的风险,并估计需要进行的工作量。避免升级基本上只会使它们更加痛苦,但是,是的,有时由于政治原因或升级在新版本中遇到问题,有时无法立即进行升级。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Spring Data REST投影中有条件地公开数据?

如何在Spring Data中使用@Transactional?

如何使用@Conditional批注在Spring中有条件地解决Bean依赖项

如何在Spring Data MongoDB查询中选择特定的列?

如何在spring-boot中禁用spring-data-mongodb自动配置

如何在Spring Boot + Spring Data中创建自定义数据源

如何在Spring Boot / Spring Data中为Amazon RDS Mysql启用SSL?

如何在 Spring Boot 和 Spring Data 中使用两个 Cassandra 数据源?

如何在Spring DATA JPA中使用UUID Generator?

如何在Spring Data Mongo DB中进行此聚合?

Spring Data MongoDB如何在实体上设置字段?

如何在JPA / Spring-Data JPA中使用审核?

如何在Spring Data JPA中使用JBossTS(Narayana)

如何在Spring Data Redis Reactive中使用事务?

如何在Spring Data CrudRepository上覆盖Delete方法?

如何在 Spring Data Elasticsearch 中为 IndexQuery 设置 OpType

如何在Spring Data JPA中搜索[FieldName]

如何在Spring Data REST项目中使用DTO?

如何在Spring Data JPA中将分页与条件查询结合?

如何在响应式Spring Data中应用分页?

如何在Spring Data JDBC中使用数组

FetchMode如何在Spring Data JPA中工作

如何在spring-data中插入db?

Spring Data,如何在保存之前合并实体?

如何在Elasticsearch Spring Data中使用StringQuery

如何在Spring Data MongoDB中使用聚合

如何在 Spring Cloud Data Flow UI 上显示日志

如何在Spring Data中执行Mongo聚合查询?

如何在Spring Data MongoDB中实现聚合查询?