代码之家  ›  专栏  ›  技术社区  ›  V. Kuznetsov

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

  •  22
  • V. Kuznetsov  · 技术社区  · 9 年前

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

    1 回复  |  直到 9 年前
        1
  •  32
  •   mp911de    9 年前

    选项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>
    

    赞成的意见

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

    欺骗

    选项2:单独升级依赖项

    spring-boot-dependencies . 然后,您只需要在项目中重新声明属性并调整版本。对于Spring数据,这将是:

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

    对于Spring数据,您在这里同时升级整个发布序列,这样,如果您只升级一个模块,您就不会在内部遇到Spring数据模块之间的不兼容问题。这是推荐这种“按属性升级”的主要原因之一,而不是在较新的版本中显式地重新声明依赖项(在某些情况下,这仍然是最后的手段)。

    赞成的意见

    • 升级是更具选择性的操作。与前一种方法不同,您不会遇到不相关依赖项的升级问题。

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

    建议的步骤

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

    1. 如果这会导致问题,请评估用手动配置替换自动配置有多难(通常需要一些引导方面的洞察力和经验。如果成功:完成)。

    避免升级只会让他们更痛苦 但是,是的,有时由于政治原因或者因为更新版本的升级遇到了问题而无法立即制作。