初めての Spring Boot アプリケーションの開発
このセクションでは、小さな "Hello World!" を開発する方法について説明します。Spring Boot の主要な機能の一部を紹介する Web アプリケーション。ビルドシステムとして Maven または Gradle を選択できます。
Eclipse STS や IntelliJ 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.4.1</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.4.1'
}
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
(Javadoc) です。これはステレオタイプアノテーションと呼ばれます。これは、コードを読む人々と Spring に、クラスが特定のロールを果たしていることのヒントを提供します。この場合、クラスは Web @Controller
(Javadoc) であるため、Spring は受信 Web リクエストを処理するときにこれを考慮します。
@RequestMapping
(Javadoc) アノテーションは「ルーティング」情報を提供します。これは、/
パスを持つすべての HTTP リクエストを home
メソッドにマップする必要があることを Spring に伝えます。@RestController
(Javadoc) アノテーションは、結果の文字列を呼び出し元に直接レンダリングするように Spring に伝えます。
@RestController (Javadoc) および @RequestMapping (Javadoc) アノテーションは Spring MVC アノテーションです (Spring Boot に固有のものではありません)。詳細については、Spring リファレンスドキュメントの MVC セクションを参照してください。 |
@SpringBootApplication アノテーション
2 番目のクラスレベルのアノテーションは @SpringBootApplication
(Javadoc) です。このアノテーションはメタアノテーションと呼ばれ、@SpringBootConfiguration
(Javadoc) 、@EnableAutoConfiguration
(Javadoc) 、@ComponentScan
(Javadoc) を組み合わせたものです。
これらのうち、ここで最も興味深いアノテーションは @EnableAutoConfiguration
(Javadoc) です。@EnableAutoConfiguration
(Javadoc) は、追加した jar の依存関係に基づいて、Spring をどのように構成するかを Spring Boot に「推測」するように指示します。spring-boot-starter-web
によって Tomcat と Spring MVC が追加されたため、自動構成では、Web アプリケーションを開発していると想定し、それに応じて Spring を設定します。
"main" メソッド
アプリケーションの最後の部分は、main
メソッドです。これは、アプリケーションのエントリポイントの Java 規則に従う標準メソッドです。メインメソッドは、run
を呼び出して、Spring Boot の SpringApplication
(Javadoc) クラスに委譲します。SpringApplication
(Javadoc) はアプリケーションをブートストラップして Spring を起動し、次に自動構成された Tomcat Web サーバーを起動します。run
メソッドに引数として MyApplication.class
を渡し、SpringApplication
(Javadoc) にどのコンポーネントが主要な Spring であるかを伝える必要があります。args
配列も渡され、コマンドライン引数が公開されます。
サンプルの実行
Maven
この時点で、アプリケーションは動作するはずです。spring-boot-starter-parent
POM を使用したため、アプリケーションを開始するために使用できる有用な run
ゴールがあります。ルートプロジェクトディレクトリから mvn spring-boot:run
と入力して、アプリケーションを起動します。次のような出力が表示されます。
$ mvn spring-boot:run
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.4.1)
....... . . .
....... . . . (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.4.1)
....... . . .
....... . . . (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 依存関係を含むアーカイブです。
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.4.1: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.4.1)
....... . . .
....... . . . (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
を押します。