web-dev-qa-db-ja.com

Spring Bootで依存関係を選択的にアップグレードするにはどうすればよいですか? (サンプルケース:Spring Data)

Spring Boot(1.4.1)のSpring Data JPAスターターを使用します。 Spring Data JPA 1.10.3が含まれています。ただし、このバージョンの春のデータにはまだ存在しない@DomainEventsアノテーションを使用する必要があります。 Spring Data JPAの最新バージョンを追加しようとすると、アプリケーションの実行時にエラーが発生します。

私のポンの例:

<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が必要です。ありがとう!

22
V. Kuznetsov

ここで猫に皮をむく方法はいくつかありますが、それぞれに利点と欠点があります。

オプション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>

長所

  • すべてのブート管理依存関係をlatestcompatibleバージョンに自動的にアップグレードします。これにより、サードパーティの依存関係のセキュリティ更新プログラムの最新の修正を確実に取得できるため、これはお勧めです

短所

  • マイナーバージョンのアップグレードでは、アプリケーションコードからサードパーティのAPIに依存している場合に備えて、構成またはAPIの設定を少し変更する必要がある場合があります。 Bootのマイナーバージョンアップグレードは、サードパーティライブラリの重大な変更を取り込めない場合、通常は非常に注意深く行われますが、残念ながらすべてがセマンティックバージョン管理に準拠しているわけではありません。ただし、適切なテストスイートがある場合は、問題が発生したかどうかを簡単に確認できます。通常、移行ガイドが含まれているため、 リリースノート を確認することをお勧めします。

オプション2:依存関係を個別にアップグレードする

以前のアプローチの代わりに、現在のブートバージョンを維持しながら、サードパーティの依存関係を選択的にアップグレードする方法があります。そのための推奨される方法は、どのバージョンのプレースホルダーが spring-boot-dependencies に存在するかを確認することです。次に、プロジェクトでプロパティを再宣言し、バージョンを調整するだけです。 Spring Dataの場合、次のようになります。

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

Spring Dataの場合、ここでリリーストレイン全体を一度にアップグレードするので、1つのモジュールをアップグレードするだけで内部的にSpring Dataモジュール間の非互換性に遭遇することはありません。これが、新しいバージョンで依存関係を明示的に再宣言するよりも、この「プロパティによるアップグレード」が推奨される主な理由の1つです(これは、場合によっては最後の手段になる可能性があります)。

長所

  • アップグレードはより選択的な操作です。以前のアプローチとは対照的に、無関係な依存関係のアップグレードの問題が発生するリスクはありません。

短所

  • 動作しない可能性があります!-マイナーリリースで、依存関係により、Bootの自動構成が依存する内部APIが変更される場合があります。これにより、起動時に自動設定が機能しなくなり、自動設定を明示的に除外して手動設定を書き込むことで、自動設定を置き換えてみることができます。

推奨される手順

実際には、私は通常、次の手順を試します。

  1. オプション1を使用して、できるだけ影響を与えずにアップグレードします。それが成功した場合:完了。
  2. 問題が発生する場合は、自動構成を手動構成に置き換えるのがどれほど難しいかを評価してください(通常、ブートに関する洞察と経験が少し必要です。それが成功した場合:完了。
  3. オプション2を使用して新しいバージョンのBootにアップグレードし、これがアプリケーションコードに与える影響を評価します。

2と3は、個人的に好むものや、チームに定義した依存関係のアップグレードポリシーに応じて交換可能です。

一般的に言えば、Bootのリリースに注意を払い、定期的にプロジェクトを新しいバージョンにドライアップグレードすることをお勧めしますが、必ずしもそのアップグレードを製品版に出荷する必要はありません。これにより、アップグレードのリスクを評価し、これに必要な作業量を見積もることができます。 基本的にアップグレードを回避すると、痛みが増しますが、政治的な理由やアップグレードが実行されているため、すぐに作成できない場合があります新しいバージョンの問題。

30
Oliver Drotbohm