😎

Spring Boot 2.x から 3.0 へコマンド一発でバージョンアップ・移行を自動化

2022/11/24に公開

はじめに

Spring Boot のバージョンアップは自動化できます。OpenRewrite という Java ソースコード、ライブラリ、フレームワークのリファクタリングを自動化するエコシステムを使用することで、API の変更に追従して安全にモダナイズし、技術的負債の排除、脆弱性の修正、コード品質を高めることができます。OpenRewrite にはレシピと呼ばれる多くのリファクタリング定義が提供されており、各種 IDE やエディターとの統合も進められています。さらに、Spring Boot の場合は Spring 公式の Spring Boot Migrator (SBM) という OpenRewrite を使用した専用の自動移行ツールがあり、Spring Boot に特化したレシピと簡単にそれをコマンドで適用するための CLI が提供されています。

Spring Boot 2.6 以下または Gradle プロジェクトの場合

まだ SBM は使用できません。OpenRewrite を直接実行してください。レシピ Spring Boot 2.x から 3.x への移行 を設定し、gradle rewriteRun または mvn rewrite:run を実行してください。

Spring Boot 2.7 Maven プロジェクトの場合

SBM が使用できます。以降では SBM 提供のレシピを使用して Spring Boot 2.7 Maven プロジェクトのバージョンアップ移行方法を見ていきます。

自動バージョンアップ方法

SBM jar ファイルのダウンロード

GitHub から spring-boot-migrator.jar 最新版 をダウンロードしてください。

バージョンアップコマンド実行

ダウンロードした jar を Java 17 で実行します。scan でプロジェクトディレクトリ (絶対パスまたは実行ディレクトリからの相対パス) を指定すると、適用可能なレシピが表示されるので、apply レシピ名 で実行するだけです。

java -jar spring-boot-migrator.jar 
migrator:> scan your-spring-boot-project
migrator:> apply boot-2.7-3.0-dependency-version-update

バージョンアップコマンド結果

pom.xml 記載のバージョンが Spring Boot 3.0、Java 17 へ書き換えられます。他、javax から jakarta へのパッケージ置換、プロパティ名や Java ソースコードの変更など、一般的な多くのケースに対応することができます。

Applying recipe 'boot-2.7-3.0-dependency-version-update'
[ok] Add Spring Boot milestone repository.
[ok] Add Spring Boot milestone plugin repository.
[ok] Add Spring Milestone Repository and bump SpringBoot to 3.0.0-M3
[ok] Set Java version to 17
[ok] Migrate SAML configuration to Spring Boot 3.0 in yaml format
[ok] Migrate SAML configuration to Spring Boot 3.0 in properties format
[ok] Remove redundant @ConstructorBinding annotations when applicable
[ok] Replace javax with new jakarta packages
[ok] Add CrudRepository interface extension additionaly to PagingAndSortingRepository
[ok] Migrate configuration to SpringBoot 3.0 in properties format

参考:Spring Boot のサポート期間

Spring Boot は 2.6、2.7、3.0 のように半年ごとにリリースされ、OSS サポート期間は 1 年ですが、2 系最後の 2.7 のサポートは半年延長され、2023 年 11 月まで使用することができます。3 への移行を無理に急ぐ必要はありませんが、2.6 以下の場合は、サポートがすでに切れていることや、安全に段階的にアップグレードするために、事前に 2.7 と Java 17 に移行しておくことが推奨されています。

https://spring.pleiades.io/projects/spring-boot#support

Spring Boot 2.7 は javax パッケージの Tomcat 9 (Jakarta EE 8 API 仕様) に対応しています。Spring Boot 3.0 は jakarta パッケージの Tomcat 10.1 (Jakarta EE 10 API 仕様) が使用されており、Tomcat 10.0 (Jakarta EE 9) でも war デプロイは可能です。ただし、Tomcat 10.0 は、すでに EOL になっており、2023 年 1 月末には公式ドキュメントやダウンロードリンクも削除されます。

おわりに

作業効率化を提供するエンジニアが、自身の仕事であるフレームワークやライブラリ移行は手作業で、世界中で同じようなことを行うのも変な話で、定型的な作業はどんどん自動化して楽しちゃいましょう!

Discussion