初めての Spring Boot アプリケーションの開発

このセクションでは、小さな "Hello World!" を開発する方法について説明します。Spring Boot の主要な機能の一部を紹介する Web アプリケーション。ビルドシステムとして Maven または Gradle を選択できます。

spring.io Web サイトには、Spring Boot を使用する「入門」ガイドが多数含まれています。特定の問題を解決する必要がある場合は、まずそこを確認してください。

Eclipse STSIntelliJ IDEA のプロジェクト作成ウィザード (Spring Initializr) の依存関係から "Spring Web" スターターを選択することにより、以下のステップをショートカットできます。これにより、新しいプロジェクト構造が 生成されるため、すぐにコーディングを開始できます。詳細については、Spring Initializr を確認してください。

前提条件

始める前に、ターミナルを開いて次のコマンドを実行して、有効なバージョンの Java がインストールされていることを確認します。

$ java -version
openjdk version "17.0.4.1" 2022-08-12 LTS
OpenJDK Runtime Environment (build 17.0.4.1+1-LTS)
OpenJDK 64-Bit Server VM (build 17.0.4.1+1-LTS, mixed mode, sharing)
このサンプルは、独自のディレクトリに作成する必要があります。以降の手順では、適切なディレクトリを作成し、それが現在のディレクトリであると想定しています。

Maven

Maven を使用する場合は、Maven がインストールされていることを確認してください。

$ mvn -v
Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0)
Maven home: usr/Users/developer/tools/maven/3.8.5
Java version: 17.0.4.1, vendor: BellSoft, runtime: /Users/developer/sdkman/candidates/java/17.0.4.1-librca

Gradle

Gradle を使用する場合は、Gradle がインストールされていることを確認してください。

$ gradle --version

------------------------------------------------------------
Gradle 8.1.1
------------------------------------------------------------

Build time:   2023-04-21 12:31:26 UTC
Revision:     1cf537a851c635c364a4214885f8b9798051175b

Kotlin:       1.8.10
Groovy:       3.0.15
Ant:          Apache Ant(TM) version 1.10.11 compiled on July 10 2021
JVM:          17.0.7 (BellSoft 17.0.7+7-LTS)
OS:           Linux 6.2.12-200.fc37.aarch64 aarch64

Maven でプロジェクトを設定する

まず、Maven pom.xml ファイルを作成する必要があります。pom.xml は、プロジェクトのビルドに使用されるレシピです。お気に入りのテキストエディターを開き、次を追加します。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.example</groupId>
	<artifactId>myproject</artifactId>
	<version>0.0.1-SNAPSHOT</version>

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

	<!-- Additional lines to be added here... -->

</project>

上記のリストにより、動作するビルドが提供されるはずです。

mvn package を実行してテストできます (現時点では、「jar は空になります - 含めるコンテンツがマークされていません ! 」という警告は無視できます)。

この時点で、プロジェクトを IDE にインポートできます(ほとんどの最新の Java IDE には Maven の組み込みサポートが含まれています)。簡単にするために、この例では引き続きプレーンテキストエディターを使用します。

Gradle でプロジェクトを設定する

Gradle build.gradle ファイルを作成することから始める必要があります。build.gradle は、プロジェクトのビルドに使用されるビルドスクリプトです。お気に入りのテキストエディターを開いて、以下を追加します。

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.3.5'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
	mavenCentral()
}

dependencies {
}

前述のリストにより、動作するビルドが得られるはずです。gradle classes を実行してテストできます。

この時点で、プロジェクトを IDE にインポートできます(ほとんどの最新の Java IDE には Gradle の組み込みサポートが含まれています)。簡単にするために、この例では引き続きプレーンテキストエディターを使用します。

クラスパスの依存関係を追加する

Spring Boot は、クラスパスに jar を追加できるスターターを多数提供しています。スターターは、特定の種類のアプリケーションを開発するときに必要になる可能性のある依存関係を提供します。

Maven

ほとんどの Spring Boot アプリケーションは、POM の parent セクションで spring-boot-starter-parent を使用します。spring-boot-starter-parent は、便利な Maven デフォルトを提供する特別なスターターです。また、「祝福された」依存関係の version タグを省略できるように、dependency-management セクションも提供されます。

Web アプリケーションを開発しているため、spring-boot-starter-web 依存関係を追加します。その前に、次のコマンドを実行して、現在の内容を確認できます。

$ mvn dependency:tree

[INFO] com.example:myproject:jar:0.0.1-SNAPSHOT

mvn dependency:tree コマンドは、プロジェクトの依存関係のツリー表現を出力します。spring-boot-starter-parent 自体には依存関係がないことがわかります。必要な依存関係を追加するには、pom.xml を編集し、parent セクションのすぐ下に spring-boot-starter-web 依存関係を追加します。

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
</dependencies>

mvn dependency:tree を再度実行すると、Tomcat Web サーバーや Spring Boot 自体を含む、多くの追加の依存関係があることがわかります。

Gradle

ほとんどの Spring Boot アプリケーションは org.springframework.boot Gradle プラグインを使用します。このプラグインは、便利なデフォルトと Gradle タスクを提供します。io.spring.dependency-management Gradle プラグインは依存関係管理を提供するため、「祝福された」依存関係の version タグを省略できます。

Web アプリケーションを開発しているため、spring-boot-starter-web 依存関係を追加します。その前に、次のコマンドを実行して、現在の内容を確認できます。

$ gradle dependencies

> Task :dependencies

------------------------------------------------------------
Root project 'myproject'
------------------------------------------------------------

gradle dependencies コマンドは、プロジェクトの依存関係のツリー表現を出力します。現時点では、プロジェクトには依存関係はありません。必要な依存関係を追加するには、build.gradle を編集し、dependencies セクションに spring-boot-starter-web 依存関係を追加します。

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
}

gradle dependencies を再度実行すると、Tomcat Web サーバーや Spring Boot 自体を含む、多くの追加の依存関係があることがわかります。

コードの作成

アプリケーションを完成するには、単一の Java ファイルを作成する必要があります。デフォルトでは、Maven および Gradle は src/main/java からソースをコンパイルするため、そのディレクトリ構造を作成してから、次のコードを含む src/main/java/MyApplication.java という名前のファイルを追加する必要があります。

  • Java

  • Kotlin

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);
	}

}
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
@SpringBootApplication
class MyApplication {

	@RequestMapping("/")
	fun home() = "Hello World!"

}

fun main(args: Array<String>) {
	runApplication<MyApplication>(*args)
}

ここには多くのコードはありませんが、非常に多くのことが行われています。次のいくつかのセクションで重要な部分を順に説明します。

@RestController および @RequestMapping アノテーション

MyApplication クラスの最初のアノテーションは @RestController です。これはステレオタイプアノテーションとして知られています。コードを読んでいる人や、クラスが特定のロールを果たす Spring のヒントを提供します。この場合、クラスは Web @Controller であるため、Spring は受信 Web リクエストを処理するときにそれを考慮します。

@RequestMapping アノテーションは、「ルーティング」情報を提供します。/ パスを持つ HTTP リクエストは home メソッドにマッピングする必要があることを Spring に伝えます。@RestController アノテーションは、結果の文字列を呼び出し元に直接返すように Spring に指示します。

@RestController および @RequestMapping アノテーションは Spring MVC アノテーションです (Spring Boot に固有ではありません)。詳細については、Spring リファレンスドキュメントの MVC セクションを参照してください。

@SpringBootApplication アノテーション

2 番目のクラスレベルのアノテーションは @SpringBootApplication です。このアノテーションはメタアノテーションと呼ばれ @SpringBootConfiguration@EnableAutoConfiguration@ComponentScan を組み合わせたものです。

その中で、ここで最も注目するアノテーションは @EnableAutoConfiguration です。@EnableAutoConfiguration は、追加した jar 依存関係に基づいて、Spring を構成する方法を「推測」するように Spring Boot に指示します。spring-boot-starter-web には Tomcat と Spring MVC が含まれているため、自動構成は Web アプリケーションを開発していると仮定し、それに応じて Spring をセットアップします。

スターターと自動構成

自動構成はスターターとうまく連携するように設計されていますが、2 つの概念は直接結びついていません。スターターの外部で jar の依存関係を自由に選択できます。Spring Boot は、引き続きアプリケーションの自動構成に最善を尽くします。

"main" メソッド

アプリケーションの最後の部分は main メソッドです。これは、アプリケーションのエントリポイントに関する Java の規則に従う標準のメソッドです。メインのメソッドは run を呼び出して Spring Boot の SpringApplication クラスに委譲します。SpringApplication はアプリケーションをブートストラップし、Spring を起動します。これにより、自動構成された Tomcat Web サーバーが起動します。MyApplication.class を引数として run メソッドに渡し、SpringApplication がプライマリ Spring コンポーネントであることを通知する必要があります。args 配列も渡され、コマンドライン引数が公開されます。

サンプルの実行

Maven

この時点で、アプリケーションは動作するはずです。spring-boot-starter-parent POM を使用したため、アプリケーションを開始するために使用できる有用な run ゴールがあります。ルートプロジェクトディレクトリから mvn spring-boot:run と入力して、アプリケーションを起動します。次のような出力が表示されます。

$ mvn spring-boot:run

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v3.3.5)
....... . . .
....... . . . (log output here)
....... . . .
........ Started MyApplication in 0.906 seconds (process running for 6.514)

Web ブラウザーを localhost:8080 で開くと、次の出力が表示されるはずです。

Hello World!

アプリケーションを正常に終了するには、ctrl-c を押します。

Gradle

この時点で、アプリケーションは動作するはずです。org.springframework.boot Gradle プラグインを使用したため、アプリケーションの起動に使用できる便利な bootRun ゴールができました。ルートプロジェクトディレクトリから gradle bootRun と入力して、アプリケーションを起動します。次のような出力が表示されるはずです。

$ gradle bootRun

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v3.3.5)
....... . . .
....... . . . (log output here)
....... . . .
........ Started MyApplication in 0.906 seconds (process running for 6.514)

Web ブラウザーを localhost:8080 で開くと、次の出力が表示されるはずです。

Hello World!

アプリケーションを正常に終了するには、ctrl-c を押します。

実行可能 Jar の作成

本番環境で実行できる、完全に自己完結型の実行可能ファイル jar ファイルを作成して、この例を終了します。実行可能 jar ( "uber jar" または "fat jar" と呼ばれることもあります) は、コンパイルされたクラスとコードの実行に必要なすべての jar 依存関係を含むアーカイブです。

実行可能 jar および Java

Java は、ネストされた jar ファイル(jar 内に含まれる jar ファイル)をロードする標準的な方法を提供しません。自己完結タイプのアプリケーションを配布しようとしている場合、これは問題になる可能性があります。

この問題を解決するために、多くの開発者は "uber" jar を使用します。uber jar は、すべてのアプリケーションの依存関係からのすべてのクラスを単一のアーカイブにパッケージ化します。このアプローチの問題は、アプリケーションにどのライブラリが含まれているかを確認しにくくなることです。また、複数の jar で同じファイル名(ただし、異なるコンテンツ)が使用されている場合、問題が発生する可能性があります。

Spring Boot は異なるアプローチを採用しており、実際に jar を直接ネストできます。

Maven

実行可能な jar を作成するには、spring-boot-maven-plugin を pom.xml に追加する必要があります。これを行うには、dependencies セクションのすぐ下に次の行を挿入します。

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>
spring-boot-starter-parent POM には、repackage ゴールをバインドするための <executions> 構成が含まれています。親 POM を使用しない場合は、この構成を自分で宣言する必要があります。詳細については、プラグインのドキュメントを参照してください。

次のように、pom.xml を保存し、コマンドラインから mvn package を実行します。

$ mvn package

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building myproject 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] .... ..
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ myproject ---
[INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:3.3.5:repackage (default) @ myproject ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

target ディレクトリを見ると、myproject-0.0.1-SNAPSHOT.jar が表示されるはずです。ファイルのサイズは約 18 MB である必要があります。内部を覗いてみたい場合は、次のように jar tvf を使用できます。

$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar

また、myproject-0.0.1-SNAPSHOT.jar.original という名前のはるかに小さいファイルが target ディレクトリに表示されるはずです。これは、Spring Boot によって再パッケージ化される前に Maven が作成した元の jar ファイルです。

そのアプリケーションを実行するには、次のように java -jar コマンドを使用します。

$ java -jar target/myproject-0.0.1-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v3.3.5)
....... . . .
....... . . . (log output here)
....... . . .
........ Started MyApplication in 0.999 seconds (process running for 1.253)

前と同様に、アプリケーションを終了するには、ctrl-c を押します。

Gradle

実行可能ファイル jar を作成するには、次のようにコマンドラインから gradle bootJar を実行する必要があります。

$ gradle bootJar

BUILD SUCCESSFUL in 639ms
3 actionable tasks: 3 executed

build/libs ディレクトリを見ると、myproject-0.0.1-SNAPSHOT.jar が表示されるはずです。ファイルのサイズは約 18 MB である必要があります。内部を覗いてみたい場合は、次のように jar tvf を使用できます。

$ jar tvf build/libs/myproject-0.0.1-SNAPSHOT.jar

そのアプリケーションを実行するには、次のように java -jar コマンドを使用します。

$ java -jar build/libs/myproject-0.0.1-SNAPSHOT.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v{version-spring-boot})
....... . . .
....... . . . (log output here)
....... . . .
........ Started MyApplication in 0.999 seconds (process running for 1.253)

前と同様に、アプリケーションを終了するには、ctrl-c を押します。