Spring Boot 3へのアップデートについて
はじめに
こんにちは、株式会社カサレアルの越智と申します。前回のブログでは弊社の平塚から、Spring Health Assessmentについての説明がありました。Spring Health Assessmentでは利用しているOSSのアップデートを推奨されたりしますが、ここではSpring Bootそのもののアップデートの方法について解説することにしましょう。
アップデートの必要性
Spring Bootは次のような開発/サポートサイクルになっています。
(2024年10月現在)
Spring Boot |
|
リリースタイミング |
年2回(5月・11月) |
OSSサポート(無償) |
1年 |
エンタープライズサポート(有償) |
2年〜2年半 |
個別のバージョンでは、次のようなサポート期間になっています。
バージョン |
初回リリース日 |
OSSサポート終了日 |
2.7.x |
2022-05-19 |
2023-11-24 |
3.0.x |
2022-11-24 |
2023-11-24 |
3.1.x |
2023-05-18 |
2024-05-18 |
3.2.x |
2023-11-23 |
2024-11-23 |
3.3.x |
2024-05-23 |
2025-05-23 |
3.4.x |
2024-11-21 |
2025-11-21 |
Spring Bootのバージョン2系は2.7が最終で、2023年の11月にサポートが切れていますね。バージョン3系は現在、バージョン3.3で今度の11月に3.4が出る予定です。3.3のサポート期間は2025年の5月までです。
(有償のエンタープライズサポートを受けるとサポートをもう少し延長できます。例えば3.3だと2026年8月までと、1年半のびます。)
参考URL: https://spring.pleiades.io/projects/spring-boot#support
バージョンアップを適切に進めないと、発見された脆弱性にきちんと対応しないまま運用することになり「危険だ」と言われるのは、よく聞く話ですね。
Spring Bootはバージョン間で何が変わっているのか
では、Spring Boot 2系から3系へは、どういった点が変更されているのでしょうか。順に見ていきましょう。
基盤技術のアップデート
Spring FrameworkがVersin.6に、Java EE 8がJakarta EE 10にそれぞれアップグレードされました。これに伴い、Javaのバージョンも17以上が必須となりました。
パッケージ名の変更
Java EEがJakarta EEと名称の変更があったため、それに伴いパッケージ名javax.*からjakarta.*に変更になりました。アノテーションのパッケージ名もjavax.*からjakarta.*に変更になっています。
Spring Data JPAを利用せずに直接 JPAを利用したプログラムを記述している等、Spring Bootのstarterライブラリで提供する機能を利用せずに、直接Java EEの機能を利用したプログラムを記述している場合も、修正が必要になります。
Spring Boot 3の新機能
Spring Boot 3では、以下の主な新機能が追加されました。
- GraalVMネイティブイメージのサポート:アプリケーションの起動速度とメモリ使用量を大幅に改善し、パフォーマンスを向上させます。特に起動時間が重要なマイクロサービスやサーバーレス環境で効果を発揮します。
- Log4j2の機能強化:プロファイル固有の構成や環境プロパティのルックアップなど、より柔軟なログ設定が可能になりました。
- マイクロメータの更新:稼働中のアプリケーションのメトリクス収集とトレース機能が強化されました。これによりアプリケーションの監視とトラブルシューティングが容易になります。
- 仮想スレッドのサポート(Spring Boot 3.2以降):Java 21の仮想スレッドを活用することで、従来のWebアプリケーションサーバーの課題であった同時リクエスト数の制限を解消し、より多くのリクエストに対応できるようになりました。
Spring Boot 3.0では、非推奨になった機能も存在します。詳しくはSpring Boot 3.0のリリースノートを参照してください。
Spring Bootのアップデート方法
Spring Boot 2系からSpring Boot3系にアップデートする場合、次の手順で進める事を公式で推奨されています。
- まずはSpring Boot 2系の最新である7へのアップデートを行う。
- それからSpring Boot 3系にアップデートする。
詳細な手順を書いていきましょう。
Spring Boot 2系の最新である2.7へのアップデート
ご自身のSpring Bootアプリケーションが利用しているSpring Bootのバージョンによりますが、いきなり3系にアップデートするのではなく、2系の最終バージョンである2.7にアップデートしましょう。それもいきなり2.7にあげるのではなく、2.4→2.5→2.7とアプリケーションの動作の様子をみながらアップデートしてください。
具体的な作業としては、pom.xmlの下記のバージョンを表す記述を変更していきます。
pom.xml
<!-- 省略 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.13</version>→2.5.15→2.6.15→2.7.15
</parent>
<!-- 省略 -->
Spring Boot 2.3以降、spring-boot-starter-webライブラリにBean Validationのライブラリが含まれなくなったので、下記の記述をpom.xmlの依存ライブラリの設定として行う必要があります。適宜追記してください。
またSpring Bootアプリケーションの設定ファイルapplication.propertiesに、変更があった場合に知らせてくれるライブラリspring-boot-properties-migratorも追加しておくと便利です。
pom.xml
<!-- 省略 -->
<dependencies>
<!-- その他のライブラリ用の設定は省略しています -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<!-- 省略 -->
■Spring Boot 3系へアップデートする
3系へのアップデートも、2系のアップデートと同じようにpom.xmlを変更することで、アップデートできます。この際もアプリケーションの動作の様子を見ながら順にバージョン番号を増やしていくとよいでしょう。
前述のようにSpring Boot 3はJavaバージョン17以降を必要としていますので、そのあたりのための設定も変更します。
pom.xml
<!-- 省略 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.10</version>
</parent>
<!-- 省略 -->
<properties>
<java.version>17</java.version>
</properties>
<!-- 省略 -->
アプリケーション内のコードにも変更が必要な場合があります。Bean ValidationとJPAで利用するアノテーションのパッケージが変更されていますので、これらのライブラリを利用している場合はimport文を全て変更してください。
//import javax.validation.constraints.Email;
//import javax.validation.constraints.NotBlank;
//import javax.validation.constraints.NotNull;
//import javax.validation.constraints.PastOrPresent;
// ↓ javax.*からjakarta.*へ置き換える ↓
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.PastOrPresent;
その他、影響を受けそうな点は下記のとおりです。
- Spring Boot 3では、@RequestMappingに設定したパスとHTTPリクエストのパスの末尾のスラッシュの有無を厳密に区別するようになりました。
「/employee/insertMain/」と「/employee/insertMain」は異なるURLと見なされます。 - Spring Boot 3では、ログの日時部分のフォーマットが変更となりました。
2系:2023-09-28 11:19:40.545
3系:2023-09-28T11:19:40.545+09:00
これらの変更により、アプリケーションの仕様変更が必要な場合がありますので留意しておいてください。
以上で、アップデートが完了です。
おわりに
トレーニングのご紹介
弊社カサレアルでは、ここで説明したアップデートについて、専門の講師と一緒に一歩一歩手を動かしながら手順を学べるトレーニングを次のようにご用意しています。
「<速習>Spring Boot 3 へのマイグレーション」
オフライン(品川)実施 https://www.casareal.co.jp/ls/service/openseminar/java/j180
オンライン(Zoom)実施 https://www.casareal.co.jp/ls/service/openseminar/java/j180-online
また最新のSpring Bootを利用するトレーニングもいくつか用意しています。その中の一つをご紹介します。
「Spring Boot 3 ではじめるWebアプリケーション開発入門」
オフライン(品川)実施 https://www.casareal.co.jp/ls/service/openseminar/java/j163
オンライン(Zoom)実施 https://www.casareal.co.jp/ls/service/openseminar/java/j163-online
このコースは3日間です。3日間それぞれの内容については、下記の通りです。
- 1日目
Spring FrameworkおよびSpring Bootの概要、そしてDIコンテナの基本を学習します。DI(依存性注入)は、Spring Bootのコアとなる概念であり、アノテーションを用いた簡単なBeanの定義からスタートし、Java Configを用いたより高度な設定方法へと進みます。Webアプリケーションの基本構造を理解し、Thymeleafを用いたシンプルなWebページの作成を行います。
- 2日目
データベースアクセスの基本となるSpring Data JPAについて詳しく学びます。エンティティクラスの設計やCRUD操作(Create、Read、Update、Delete)の実装を通じて、データの永続化を行う方法を習得します。ページネーションや列ソートなど、実務で役立つ機能もコンテンツとして用意されています。ビジネスロジック層との統合について学び、トランザクション管理の重要性を理解します。
- 3日目
最終日はプレゼンテーション層の構築からスタートし、セッション管理やエラーハンドリング、ファイルアップロード機能の実装など、実際のアプリケーション開発で直面する問題に対処するスキルを磨きます。
このコースは、Spring Boot 3.x・Java 21といった最新の環境で学べるよう準備されていますので、現場で即戦力となる技術を習得できます。
また実際に手を動かしながら学べますので、よりよくスキルを身に付けることができます。
基本的なJavaの知識があれば問題なく受講できますので、ぜひご受講を検討してください。よろしくお願いいたします。
関連リンク
この記事の著者:越智理夫
様々な研修コースの開発および実施を担当。研修コンテンツへのゲーミフィケーション導入を日夜、探求している。
DevOps Hubのアカウントをフォローして
更新情報を受け取る
-
Like on Facebook
-
Like on Feedly