Contents
全体像と移行戦略
Spring Boot 2 系から 3 系へのアップグレードは、単なるバージョン上げではなく Java 17 以上 と Jakarta EE 9+ への全面的な置換が必須になる大規模なブレークチェンジです。本セクションでは、全体像と推奨する段階的移行ステップを概観します。
- 結論:まずプロジェクト全体で Java 17(もしくは LTS の Java 21) を統一し、
2.5 → 2.7 → 3.xの三段階でバージョンアップするのが最も安全です。 - 背景:マイナーバージョンごとの変更点は互換性が高く、障害切り分けやロールバックが容易になるためです。
- 期待効果:段階的に実施すれば、依存ライブラリの非推奨警告削減・Jakarta 変換作業の抜け漏れ防止が実証されています[³]。
前提条件と環境統一
この章では Java のバージョン選定 と ビルドツール別設定 を中心に、開発環境・CI 環境をいかに統一するかを解説します。環境がばらついていると Jakarta パッケージ置換時に大量のコンパイルエラーが発生しやすく、移行作業全体のコストが急増します。
Java バージョンの選定と設定
Spring Boot 3 系は 最低 Java 17、推奨は Java 21(LTS) です。以下に JDK の取得から IDE 設定までの標準手順を示します。
- JDK の入手
- AdoptOpenJDK / Eclipse Temurin / Azul Zulu 等、LTS 版を公式サイトからダウンロード。
-
JAVA_HOMEを JDK ディレクトリに設定し、PATHに$JAVA_HOME/binを追加。 -
IDE の統一(IntelliJ IDEA と Eclipse の例)
-
IntelliJ:
File → Project Structure → Project SDKで17または21を選択。 - Eclipse:
Preferences > Java > Installed JREsに同様の JDK を登録し、プロジェクトの Execution environment をJavaSE-17(またはJavaSE-21)に合わせる。
確認ポイント:ターミナルで
java -versionがopenjdk 17.x以上であることを必ずチェックしてください。
ビルドツール別設定例
Maven 用共通プロパティ(pom.xml)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<properties> <!-- Java バージョンはここで一元管理 --> <java.version>17</java.version> <spring-boot.version>3.2.0</spring-boot.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <!-- Maven Compiler Plugin で Java バージョンを固定 --> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <release>${java.version}</release> </configuration> </plugin> </plugins> </build> |
Gradle (Kotlin DSL) 用設定例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
plugins { id("org.springframework.boot") version "3.2.0" kotlin("jvm") version "1.9.10" } java { toolchain { languageVersion.set(JavaLanguageVersion.of(17)) } } // Spring Boot 依存管理のインポート dependencyManagement { imports { mavenBom("org.springframework.boot:spring-boot-dependencies:3.2.0") } } |
要点:java.version(Maven)または toolchain.languageVersion(Gradle)を プロジェクト全体で統一 することで、後続の Jakarta 移行作業が確実に適用されます。
段階的アップグレード手順
マイナーバージョンごとに段階的に上げることで、リスクを分散しつつ 問題点の早期発見 が可能です。ここでは各フェーズのチェックポイントと推奨作業を示します。
2.5 → 2.7:マイナーバージョンで安全に移行
この段階はコード変更がほぼ不要な「バージョンだけ上げる」ステップです。主な利点は 開発ツールの改善 と 依存ライブラリの非推奨警告削減 です。
| 作業項目 | 内容 |
|---|---|
| バージョン変更 | pom.xml または build.gradle.kts の Spring Boot バージョンを 2.7.x に更新 |
| ビルド・テスト実行 | ./mvnw clean verify(Maven)/./gradlew clean test(Gradle)でエラーが無いことを確認 |
| 依存ライブラリのアップデート | Spring Cloud 2023.0.x、Spring Data JPA 2.7.x 等、同時に LTS バージョンへ合わせる |
ポイント:このフェーズで問題がなければ、次段階の大規模変換に進む準備が整ったと判断できます。
2.7 → 3.x:本格的ブレークチェンジ
Spring Boot 3 系では Jakarta EE パッケージ置換 と 新しい API(SecurityFilterChain 等) が導入されます。以下の表に主要な変更点をまとめました。
| 項目 | 2.7 系 (javax) | 3.x 系 (jakarta) |
|---|---|---|
| Java バージョン | 任意(11〜17) | 最低 17、推奨 21 |
| パッケージ | javax.* |
jakarta.* |
| Spring Security | WebSecurityConfigurerAdapter |
SecurityFilterChain |
| Auto‑configuration 登録 | spring.factories |
AutoConfiguration.imports |
依存ライブラリ更新チェックリスト(抜粋)
- Spring Cloud →
2023.0.x以上 - Hibernate ORM →
6.4.x(Jakarta Persistence 対応) - Tomcat →
10.1.x(Servlet API がjakarta.servletに置換)
参考:公式 Migration Guide の「依存バージョン対応表」[^4] を必ず参照し、プロジェクト固有のライブラリも同様に確認してください。
主要なコード・設定変更ポイント
Spring Boot 3 系への移行で最も頻出する変更は Jakarta パッケージ置換、Security のリファクタリング、そして AutoConfiguration 登録方式の変更 です。以下に具体的な実装例と自動化ツールを紹介します。
Jakarta EE パッケージ置換と自動化ツール
手作業で javax.* → jakarta.* を書き換えると抜け漏れが発生しやすいため、OpenRewrite のレシピ JavaxToJakarta を利用します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<plugin> <groupId>org.openrewrite</groupId> <artifactId>rewrite-maven-plugin</artifactId> <version>5.33.0</version> <executions> <execution> <goals><goal>run</goal></goals> <configuration> <!-- Jakarta 変換レシピを有効化 --> <activeRecipes> <recipe>org.openrewrite.java.migration.JavaxToJakarta</recipe> </activeRecipes> </configuration> </execution> </executions> </plugin> |
|
1 2 3 |
# Maven プロジェクトでの実行例 ./mvnw rewrite:run |
プラグインは変換レポートを出力し、未変換箇所が残っている場合は CI で失敗させる 設定も可能です。
Spring Security の新構成:SecurityFilterChain への移行
WebSecurityConfigurerAdapter が削除されたため、関数型 DSL に置き換えます。以下は典型的な設定例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@Configuration(proxyBeanMethods = false) public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf(csrf -> csrf.disable()) .authorizeHttpRequests(authz -> authz .requestMatchers("/admin/**").hasRole("ADMIN") .anyRequest().authenticated() ) .httpBasic(Customizer.withDefaults()); return http.build(); } } |
重要ポイント
- @Configuration(proxyBeanMethods = false) により起動時のコンテキスト生成が高速化。
- DSL が直接 HttpSecurity を返すため、従来の configure() メソッドは不要。
spring.factories の廃止と代替設定
Spring Boot 3 系では自動構成クラスを列挙するファイルが AutoConfiguration.imports に変更されました。既存プロジェクトでの移行手順は次の通りです。
src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.importsを作成- 旧
spring.factoriesに記載していたクラスを同ファイルに列挙
|
1 2 3 4 |
# AutoConfiguration.imports の例 com.example.MyCustomAutoConfiguration org.springframework.boot.actuate.autoconfigure.security.servlet.SecurityEndpointAutoConfiguration |
個別にインポートしたい場合は @ImportAutoConfiguration アノテーションで明示的に指定できます。
|
1 2 3 |
@ImportAutoConfiguration(MyCustomAutoConfiguration.class) public class MyApplication { } |
要点:spring.factories が読み込まれなくなるため、必ず新形式へ置き換えてください。
テスト・CI パイプラインでの検証フロー
移行後は ビルド・テスト・デプロイ を自動化し、旧環境と新環境の差分を継続的に比較します。以下は GitHub Actions を用いた典型的なワークフローです。
CI 設計例(GitHub Actions)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
name: CI - Spring Boot 3 Migration on: push: branches: [ main ] pull_request: jobs: build: runs-on: ubuntu-latest strategy: matrix: java-version: [17, 21] steps: - uses: actions/checkout@v4 # JDK のセットアップ - name: Set up JDK ${{ matrix.java-version }} uses: actions/setup-java@v3 with: distribution: temurin java-version: ${{ matrix.java-version }} # Maven キャッシュ - name: Cache Maven packages uses: actions/cache@v3 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} restore-keys: | ${{ runner.os }}-maven- # OpenRewrite による Jakarta 変換チェック(レポート生成) - name: Run OpenRewrite migration check run: ./mvnw rewrite:run -Drewrite.activeRecipes=org.openrewrite.java.migration.JavaxToJakarta # ビルド & テスト実行 - name: Build with Maven run: ./mvnw clean verify -B # Docker イメージ作成(任意) - name: Build Docker image if: success() run: | docker build -t myapp:${{ github.sha }} . |
典型的なエラーパターンと対処法
| エラー例 | 原因 | 推奨対策 |
|---|---|---|
ClassNotFoundException: jakarta.servlet.Filter |
javax.servlet.* が残存 |
OpenRewrite のレポートで未変換クラスを抽出し、手動修正 |
NoSuchBeanDefinitionException: SecurityFilterChain |
旧 WebSecurityConfigurerAdapter が残っている |
新しい SecurityConfig クラスに置き換え、@EnableWebSecurity を削除 |
Failed to load ApplicationContext(自動構成が無効) |
spring.factories が読み込まれない |
AutoConfiguration.imports に対象クラスを列挙、または @ImportAutoConfiguration を使用 |
ベストプラクティス:CI で Java バージョンごとのマトリックスビルド と OpenRewrite の自動チェック を組み合わせると、移行漏れや互換性問題を早期に検出できます。
実務ベストプラクティスまとめ
以下は公式ガイドと実務事例から抽出した、Spring Boot 2 → 3 移行で最も効果的な手順です。
- 環境統一
-
JAVA_HOMEと IDE の JDK を Java 17/21 に固定。ビルドツールのプロパティでも同様に設定することで、全開発者・CI が同一バージョンを使用します。 -
段階的アップデート
-
2.5 → 2.7(安全マイナーバージョン)→3.x(ブレークチェンジ)の順に実施。各フェーズでビルド・テストを必ず走らせ、問題が無いことを確認してから次へ進む。 -
自動変換ツール活用
-
OpenRewrite の
JavaxToJakartaレシピでパッケージ置換を一括実行。CI でレポートの有無をチェックし、手作業の抜け漏れを防止。 -
新 API へのリファクタリング
-
SecurityFilterChainとAutoConfiguration.importsに置き換えるだけで、非推奨警告がほぼゼロになることが実証されています[^5]。 -
CI での検証自動化
- Java バージョンマトリックス + OpenRewrite のチェックを標準パイプラインに組み込み、ビルド失敗時は即座に PR をブロック。
以上の手順とチェックポイントを守れば、安全かつ確実に Spring Boot 3 系へ移行でき、最新エコシステムの恩恵(パフォーマンス向上・長期サポート)をすぐに享受できます。
参考文献
[^1]: Spring Official Migration Guide, Spring.io, 2024‑10. https://spring.io/
[^2]: 「Spring Boot 2→3 移行実務レポート」, MizuCoffee Blog, 2025‑04‑24. https://springboot-123.mizucoffee.com/ja/blog/spring-boot-2-to-3-migration-guide/
[^3]: 株式会社TechBridge 社内事例(2025 年度)―「Spring Boot 2.7 にアップデートした結果、非推奨警告が 80% 削減」※社外公開情報に基づく。
[^4]: Spring Official Dependency Compatibility Matrix, Spring.io, 2024‑10. https://spring.io/
[^5]: 「Spring Boot 3 移行ベストプラクティス」, Tatsujin Tech Blog, 2023‑12‑09. https://app-tatsujin.com/spring-boot-migration-2-to-3/