11 人が閲覧(直近 30 日) Java

Spring Bootとは|4.1系の依存名の変更と最小Web APIの作り方

Spring Bootとは|4.1系の依存名の変更と最小Web APIの作り方

Spring Bootの日本語解説は「Springを簡単にしたもの」で終わるものが多く、その説明のまま2026年に手を動かすと最初のビルドで足を取られます。公式チュートリアルが使う依存はspring-boot-starter-webmvcに変わり、spring-boot-starter-webは非推奨に回りました。この記事は、自動構成が何を省いているのか、4.1系を動かすJavaとビルドツールの下限、Initializrをcurlで叩いてHello Worldまで届く手順、3系から4系へ移るときの作業範囲を一本につなぎます。数値と依存名は2026年9月7日時点の公式ドキュメントとInitializrの応答から取りました。

まとめ|Spring Boot導入前に決める3点と4.1系の依存名の変更

先に結論です。着手前に決めるのは、①どの版で作るか、②Web層をMVCとWebFluxのどちらで書くか、③Javaを17と21以降のどこに置くか。この3つが決まれば残りは依存の指定とコードの作業に落ちます。

4系で変わった実務上の最大点は依存名です。spring-boot-starter-webは非推奨となり、公式チュートリアルもInitializrの生成結果もspring-boot-starter-webmvcを出します。テスト依存もspring-boot-starter-webmvc-testのようにモジュール別へ分かれました。日本語の入門記事を写すと、非推奨の依存名で書き始めることになります。

版の桁も先に。現行GAは4.1.1で、併走しているのは4.0.8・3.5.16・3.4.13・3.3.13。start.spring.ioで新規生成できるのは4.0.8と4.1.1だけで、3系は選択肢から消えています。Javaは17以上26まで、Spring Frameworkは7.0.9以上が必要です。

Spring Bootの正体|Spring Frameworkとの関係と自動構成の役割

Spring BootはSpring Frameworkの代替ではなく、その上に載る配布形態とデフォルト設定の集合です。ここを取り違えると、設定が効かないときの調査先を間違えます。

自動構成がXMLとBean定義から肩代わりしている設定作業の範囲

Spring Frameworkだけでアプリを組む場合、DataSource・トランザクションマネージャ・ビューリゾルバ・メッセージコンバータといったBeanを自分で定義し、Servletコンテナへの登録も書きます。自動構成は、クラスパスに何が載っているかを見てこれらを条件付きで組み立てる仕組みです。spring-boot-starter-webmvcを1行入れるだけでJSONを返すコントローラが動くのは、Jacksonのメッセージコンバータと組み込みTomcatの起動が自動構成側で用意されるからです。

入口は@SpringBootApplicationです。公式チュートリアルのとおり、これは自動構成の有効化とコンポーネントスキャン、設定クラス宣言をまとめたメタアノテーションで、SpringApplication.run()と組み合わせて使います。判断は「設定より規約」で行われるため、意図しないBeanが立ち上がることもある。どのアノテーションがどの層を担うかはSpring Bootの主要なアノテーション一覧|DI・MVC・JPA・バリデーション・AOPを役割別に整理で引けます。

組み込みTomcatで単体JAR実行になる構造と従来のWAR配備との違い

従来のJava Webアプリは、WARを作って別途インストールしたTomcatへ配備する形が標準でした。Tomcat自体の仕組みと、外部Tomcatと組み込み版の選び分けはTomcatとは?サーブレットコンテナの仕組みと対応Java版・Apacheとの分担で解説しています。Spring Bootはサーブレットコンテナをアプリ側の依存に取り込み、java -jarで起動できる実行可能JARを作ります。4.1系の組み込みコンテナはシステム要件のとおりTomcat 11.0.xとJetty 12.1.xで、いずれもServlet 6.1対応版です。

この構造がコンテナ運用と噛み合います。JARが自己完結するため、Dockerイメージには実行環境とJARだけを入れればよく、コンテナ側のバージョン管理をビルド定義に閉じ込められる。逆に、アプリケーションサーバーを共有運用している現場ではWAR配備のままのほうが構成管理は簡単で、Servlet 6.1以上のコンテナならWAR配備も可能です。

4.1系の動作要件|Java 17以上と組み込みTomcat 11.0系の前提

「動かない」の相談で最も多いのが要件の読み違いです。4系は3系から下限が上がっているため、既存の開発環境をそのまま使えないことがあります。

Java・Maven・Gradleの下限バージョンと実務で選ぶべきJavaの版

4.1.1の要件は、Java 17以上(26まで対応)、Spring Framework 7.0.9以上、Maven 3.6.3以上、Gradle 8.14以上の8.x系または9.x系です。ネイティブイメージを作る場合はGraalVM Community 25とNative Build Tools 1.1.8が対応版です。公式チュートリアルはさらに新しいMaven 3.9.12以上、Gradle 8.14.4以上を前提に書かれているため、CIのイメージを更新せず進めると差分でつまずきます。

実務でどのJavaを選ぶかは、Initializrの選択肢が答えになります。start.spring.ioが提示するのは17・21・25・26で、既定は17。新規案件では21以降を選んでください。理由は仮想スレッドで、4系はspring.threads.virtual.enabledによる自動構成が整っており、21未満ではこの選択肢を捨てることになります。17は稼働環境のランタイムを上げられないときだけです。

Initializrで生成できる版が4.0系と4.1系だけになった事情と3系案件の扱い

2026年9月7日時点のSpring Initializrが新規プロジェクト用に提示するbootVersionは、4.2.0のマイルストーンとスナップショットを除くと4.1.1と4.0.8だけです。既定値も4.1.1で、3.5系以前はメニューから消えています。GitHub Wikiのサポート方針ではメジャーが3年以上、マイナーが12か月以上と定められており、選択肢はこの方針に沿って絞られます。

3系で新規に作る必要がある場合は、生成後に親POMのversionを手で書き換え、依存名を3系へ戻す作業が発生します。既存案件をいつ上げるかの判断材料はSpring Bootバージョン一覧とサポート期限【2026年8月】最新4.1と3.5 EOL後の選び方に版ごとの期限を整理してあります。判断を先に書くと、稼働中の3.5系では4系移行を機能追加と同じスプリントに入れないほうが安全です。Jackson 3.0の切り替えが本体側へ波及します。

Initializrでのプロジェクト生成|curl実行と17行の最小コード

ここからは手を動かす部分です。ブラウザのフォームを使わずcurlで生成できるので、プロジェクトの雛形作成をスクリプトに組み込めます。

start.spring.ioをcurlで叩いてzipを生成するコマンド

Initializrはブラウザ用のフォームだけでなく、HAL形式のAPIとしても公開されています。starter.zipにパラメータを渡せば雛形をその場で取得できます。公式ヘルプに載っている形はこうです。

$ curl -G https://start.spring.io/starter.zip \
    -d dependencies=web,actuator \
    -d bootVersion=4.1.1 \
    -d javaVersion=21 \
    -d type=maven-project \
    -d groupId=com.example \
    -d artifactId=demo \
    -d baseDir=demo \
    -o demo.zip

$ unzip demo.zip && cd demo

主なパラメータはbootVersion(既定4.1.1)、dependencies(カンマ区切りの依存ID)、javaVersion(既定17)、type(maven-project/gradle-project/gradle-project-kotlin)、packaging、baseDirです。pom.xmlだけが欲しいときはcurl -G https://start.spring.io/pom.xml -d packaging=war -o pom.xmlとエンドポイントを変えます。

親POMと依存1本で動く最小構成の中身とテスト依存の分かれ方

生成されるpom.xmlの骨格は、親POMにspring-boot-starter-parentを指定し、依存を並べ、spring-boot-maven-pluginを入れるだけです。個別の依存にバージョン番号を書かずに済むのは、親POMが依存管理表を持つため。dependencies=web,actuatorを指定したとき、4.1.1が実際に生成する依存は次のとおりです。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>4.1.1</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webmvc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webmvc-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

webという依存IDを渡したのにspring-boot-starter-webmvcが入る点と、テスト依存がwebmvc-test・actuator-testへ分かれる点に注意してください。Actuatorのエンドポイント設定はSpring Boot Actuatorの使い方|エンドポイント公開設定と監視・診断を実装するにまとめています。

@RestControllerを足した17行のクラスと起動確認の2コマンド

公式チュートリアルの最小アプリは、パッケージ宣言とインポート4行を含めても、空行を除けば17行です。@SpringBootApplicationと@RestControllerを同じクラスに付け、mainでSpringApplication.run()を呼びます。

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class MyApplication {

    @RequestMapping("/")
    String home() {
        return "Hello World!";
    }

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

ファイルの置き場所はsrc/main/java/com/example/MyApplication.javaです。起動と確認は2コマンドで済みます。Gradleならgradle bootRunに読み替えてください。

$ mvn spring-boot:run
$ curl -i http://localhost:8080/
HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8

Hello World!

ここまでWebサーバーの設定ファイルは1行も書いていません。省けたのはTomcatのインストール、web.xmlの記述、WARの配備、ポート設定の4点です。

スターター名の変更|starter-web非推奨とwebmvcへの置き換え

ここが日本語圏の情報がいちばん追いついていない箇所です。検索して出てくるサンプルの依存名は、4系では非推奨になっています。

webからwebmvcへ置き換わった依存名とリファレンス上の非推奨表記

4.1.1のリファレンスのスターター一覧では、spring-boot-starter-webに非推奨の注記が付き、Spring MVCとTomcatでWebアプリを作るスターターとしてspring-boot-starter-webmvcが並んでいます。公式チュートリアルのpom.xmlもGradle版もwebmvc側です。

影響は限定的で、機械的な置き換えで済みます。spring-boot-starter-webは当面動きますが、新規のコードで採用する理由はありません。4系へ上げるときは依存名の置換をチェックリストに1項目として入れてください。リアクティブ側の依存はspring-boot-starter-webfluxで変わらず、判断基準はSpring WebFluxとは?ノンブロッキング・リアクティブなWeb開発の基礎【2026年版】で整理しています。

主要スターター8種の接尾辞と用途・4系で選ぶべき依存名の一覧

命名規約はspring-boot-starter-*で、サードパーティ製は{プロジェクト名}-spring-boot-starterという逆順です。接頭辞のspring-bootは公式に予約されており、自社で共通スターターを作る場合も後置にします。4.1.1の主要スターターは次の対応で、表の接尾辞はいずれもspring-boot-starterに続く部分です。

接尾辞 用途 備考
(接尾辞なし) 自動構成・ロギング・YAML コアスターター
-webmvc Spring MVC+Tomcat 4系での標準
-web Spring MVC+Tomcat 非推奨
-webflux WebFlux+Reactor Netty リアクティブ用
-data-jpa Spring Data JPA+Hibernate RDBアクセス
-security Spring Security 認証・認可
-actuator 監視・管理エンドポイント 本番運用向け
-test JUnit Jupiter・Mockito等 4系はモジュール別も併存

OAuth2関連はspring-boot-starter-security-oauth2-clientのようにsecurity配下へ整理されました。認証の実装そのものはSpring Securityとは?認証・認可の仕組みと基本設定をわかりやすく解説【2026年版】で扱っています。

3系から4系への移行|Jackson 3とパッケージ移動の影響範囲

4系のアップグレードは、依存名を書き換えるだけでは終わりません。作業量を決めるのは、アプリがJacksonのAPIをどれだけ直接触っているかです。順序は3.5系を経由して4.0、その後4.1が公式の推奨で、得られるものはHTTP Service ClientsとAPIバージョニングの自動構成です。

Jackson 3.0への切り替えで書き換えが必要になるコードの範囲

4.0のリリースノートによると、4系はJackson 3.0へメジャーアップグレードし、Jackson 2のサポートは非推奨として残りました。JSONの入出力をコントローラの戻り値とリクエストボディだけで済ませているアプリなら影響はほぼ出ません。書き換えが要るのは、ObjectMapperを自分でBean定義している箇所、カスタムシリアライザを実装している箇所、@JsonComponent相当の拡張を入れている箇所です。

見積もりは、この3種類の出現箇所を数えることから始めてください。ゼロなら依存名の置換とビルド確認で終わり、数十箇所あるなら独立したタスクとして工数を積む。あわせてSpring FrameworkとSpring Securityが7.0へ上がり、Jakarta EE側もServlet 6.1・Persistence 3.2になります。

パッケージ移動・プロパティ名変更と自動構成クラスの可視性制限

設定プロパティとクラスの置き場所にも変更が入りました。spring.dao.exceptiontranslation.enabledはspring.persistence.exceptiontranslation.enabledへ、management.tracing.enabledはmanagement.tracing.export.enabledへ改名。org.springframework.boot.env.EnvironmentPostProcessorもorg.springframework.boot.EnvironmentPostProcessorへ移り、旧パッケージは非推奨です。

見落としやすいのが可視性の制限です。自動構成クラスのpublicメンバーが定数を除いてpackage-privateへ変わったため、自動構成クラスを継承したり内部のBean定義メソッドを直接呼ぶコードはコンパイルが通りません。4.1までの差分はSpring Boot 4とは?最新バージョン4.1の変更点・新機能とSpring Boot 3との違いを解説【2026年最新】で追えます。

受託開発でSpring Bootを選ぶ条件と見送るべき2つの場面

ここは判断を言い切ります。Spring Bootは万能ではなく、選ばないほうが早く終わる案件があります。

基幹連携と長期保守が前提の案件でSpring Bootを選ぶ条件

採用条件は3つです。第一に、基幹システムやRDBとの連携が主要件で、トランザクション整合性を自前で書きたくない案件。Spring Data JPAと宣言的トランザクションで済む範囲が広く、実装量が読めます。第二に、5年以上の保守が前提で要員の入れ替わりが想定される案件。メジャー3年以上・マイナー12か月以上という明示された方針があり、EOLの計画が立てられます。第三に、Java要員を確保できる体制。

3条件がそろう典型が、業務システムのWeb API化です。既存DBを触りながら社内システムや外部SaaSへ接続する構成では、Spring Bootの守備範囲が要件とほぼ重なります。API層の設計や接続方式の検討から相談したい場合はAPI開発・システム連携で対応しています。

見送るべき2つの場面と拡張が見込まれる案件での代替案の選び方

見送るのは2つです。1つ目は、画面数点の社内ツールを短期で作るだけの案件。依存の把握コストが要件に対して過剰で、同じものがPythonやNode.jsのフレームワークなら半分以下の記述量で終わります。2つ目は、Java要員が社内に1人もいない体制で新規に始める案件。自動構成のおかげで動き始めるまでは速いものの、想定と違う挙動を追うにはSpring Framework側のBean定義とライフサイクルを読む力が必要で、その学習コストが最初の納期を圧迫します。

迷うのは、小規模だが拡張が見込まれるケースです。拡張の中身で分けてください。RDBのトランザクションと権限管理が増えるならSpring Boot、外部APIの中継と画面だけが増えるなら軽量なフレームワークで始めて後から切り出す。「将来のために」で重い構成を先に置くと、動かない期間だけが長くなります。

よくある質問

Spring Bootの導入検討で実際に多い質問を、公式ドキュメントの記述に沿って回答します。

Spring BootとSpring Frameworkは何が違うのですか?

Spring FrameworkはDIコンテナとAOP、Web MVCを提供する土台のライブラリで、Spring Bootはその上に自動構成・スターター依存・実行可能JAR・Actuatorを足した配布形態です。動いているのはSpring Frameworkで、4.1系は7.0.9以上を必要とします。設定が効かない原因を追うときは、自動構成の条件判定とBean定義の両方を見ることになります。

Spring Bootを始めるならどのバージョンを選べばよいですか?

新規なら4.1系です。start.spring.ioが新規生成用に提示するのは4.1.1と4.0.8だけで、既定値は4.1.1です。3.5系や3.4系を保守している場合は、機能追加とは別のタスクとして移行を計画してください。Javaは17以上が必須ですが、仮想スレッドを使える21以降のほうが後の選択肢が残ります。

spring-boot-starter-webとspring-boot-starter-webmvcはどちらを使いますか?

4系ではspring-boot-starter-webmvcです。4.1.1のリファレンスでspring-boot-starter-webに非推奨の注記が付き、公式チュートリアルもInitializrの生成結果もwebmvc側を出します。dependencies=webという依存IDを指定した場合でも、生成されるpom.xmlに入るのはspring-boot-starter-webmvcです。既存の3系プロジェクトではstarter-webのままで問題ありません。

Spring Bootの学習にはどのくらいの期間が必要ですか?

Hello Worldまでなら、Javaの基礎がある人で数時間です。依存1本とアノテーション2つで動くため、最初の成功体験は早い。時間がかかるのはその先で、DIコンテナのライフサイクル、トランザクション境界、JPAのフェッチ戦略、Securityのフィルタチェーンの4つが実務の詰まりどころです。この4つを押さえないまま本番に出すと、性能問題と権限漏れの調査に入ります。

Spring Bootで作ったアプリはコンテナで動かせますか?

動かせます。実行可能JARが組み込みTomcatを内包するため、ベースイメージにJavaランタイムとJARを置くだけで起動します。4.1系の組み込みコンテナはTomcat 11.0.xとJetty 12.1.xで、Servlet 6.1対応です。GraalVM Community 25とNative Build Tools 1.1.8でネイティブイメージにすれば起動時間とメモリ使用量は下がりますが、リフレクションを使うライブラリの設定追加が発生します。

関連記事

お気に入りに入れた記事の一覧

この記事は以下の記事からリンクされています

ほか 12 件の記事からもリンクされています。

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.07.21 テックブログ Apache Tomcatの脆弱性一覧【2026年10月】最新版11.0.27・10.1.61・9.0.123とCVE-2026-59083ほかの影響確認・対応手順
  2. 2026.10.21 テックブログ NEC委託先の不正アクセスとは|顧客システム暗号化・情報漏えいの経緯と委託元が点検する正規アカウント
  3. 2026.10.21 テックブログ ふるさとチョイス不正アクセスで445万件流出:対象確認・パスワード変更と再開時期
  4. 2026.10.22 テックブログ Tomcatバージョン一覧とサポート期限【2026年10月】9.0系は2027年3月末で終了・9.1系と11.0系への移行判断
  5. 2024.07.05 コラム XAMPPの脆弱性とは?危険性とCVE-2024-4577への対策をわかりやすく解説【2026年10月】

RELATED POSTS 関連記事

目次