Spring Boot 環境構築 (Java/Gradle)
[履歴] [最終更新] (2017/05/22 23:53:00)
最近の投稿
注目の記事

概要

Spring は様々なフレームワークを提供する、Java のプロジェクト群です。Spring BatchSpring SecuritySpring Loaded といったプロジェクトがあります。Spring Boot は、これら Spring フレームワークを内部的に利用するフレームワークです。効率的なアプリケーション開発が可能になります。環境構築の手順を把握できるサンプルコードをまとめます。一通り把握できたら、次回以降は雛形を Spring Initializr で生成して、以下の公式ドキュメントを参考にしつつ開発できます。

サンプルコード

ディレクトリの作成

ディレクトリを以下のように作成します。

mkdir -p src/main/java/hello
mkdir -p src/test/java/hello

Gradle 設定

ビルドスクリプトを作成します。特に Gradle の場合は以下のようになります。

touch build.gradle

build.gradle

buildscript {
    ext {
        springBootVersion = '1.5.3.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'

jar {
    baseName = 'gs-spring-boot'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {

    // Tomcat の代わりに Jetty を使用してみます。
    compile('org.springframework.boot:spring-boot-starter-web') {
        exclude module: 'spring-boot-starter-tomcat'
    }
    compile('org.springframework.boot:spring-boot-starter-jetty')

    // '/health' エンドポイントなどを自動で追加するライブラリです。
    // https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html
    compile('org.springframework.boot:spring-boot-starter-actuator')

    // Spring Test を利用できるように設定します。
    testCompile('org.springframework.boot:spring-boot-starter-test')
}
項目 概要
buildscript 文字通りビルドスクリプト build.gradle の設定を行います。
ext extra properties を設定します。properties タスクで表示できる項目に加えて、独自定数を追加します。
repositories 依存するレポジトリを設定します。buildscript ブロック内であれば、ビルドスクリプトが依存するレポジトリになります。buildscript ブロック外であれば、プロジェクトが依存するレポジトリになります。mavenCentral()The Central Repository です。jcenter() レポジトリも有名です。社内に独自レポジトリが存在する場合もここで設定します。
dependencies 依存するレポジトリ内のうち、使用するライブラリを指定します。
apply plugin ビルドスクリプト build.gradle で必要になるプラグインを設定します。
jar 成果物 JAR ファイルの名称を設定します。
sourceCompatibility コンパイル時に必要になる Java のバージョンを指定します。例えば 1.8 を指定している場合は、実際には Java 1.7 ではコンパイルできるようなソースコードであっても、コンパイルに失敗するように設定したことになります。Java 8 で追加された記法を使用している場合などは、設定しておいたほうが親切です。
targetCompatibility コンパイルしたクラスファイルを動作させる想定の JVM のバージョンを指定します。sourceCompatibility と同じ値が既定値になります。
compile プロジェクトが実行時に依存するライブラリを指定します。
testCompile プロジェクトがテスト実行時に依存するライブラリを指定します。

Java ソースコード (後述)

touch src/main/java/hello/Application.java
touch src/main/java/hello/HelloController.java
touch src/test/java/hello/HelloControllerTest.java
touch src/test/java/hello/HelloControllerIT.java

ビルドおよび実行

gradle wrapper
./gradlew build
java -jar build/libs/gs-spring-boot-0.1.0.jar

curl 実行例

$ curl http://localhost:8080/
Greetings from Spring Boot!

$ curl -s http://localhost:8080/health | jq .
{
  "status": "UP"
}

Java ソースコード

src/main/java/hello/Application.java

package hello;

import java.util.Arrays;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class Application {

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

    @Bean
    public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
        return args -> {

            System.out.println("Let's inspect the beans provided by Spring Boot:");

            String[] beanNames = ctx.getBeanDefinitionNames();
            Arrays.sort(beanNames);
            for (String beanName : beanNames) {
                System.out.println(beanName); // 定義された Bean 名を出力します。`commandLineRunner` も含まれます。
            }
        };
    }
}
項目 概要
@SpringBootApplication @Configuration, @EnableAutoConfiguration, @ComponentScan を統合したアノテーションです。
@Bean @Configuration が設定されたクラスのメソッドに対して設定できます。@Bean 設定されたメソッドはインスタンスを返します。これは設定値をもつシングルトンとして、アプリケーション全体で利用できます。CommandLineRunner を返す Bean 定義は特殊で、アプリケーション起動時に実行される処理を設定できます。

src/main/java/hello/HelloController.java

package hello;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
public class HelloController {

    @RequestMapping("/")
    public String index() {
        return "Greetings from Spring Boot!";
    }
}
項目 概要
@RestController @Controller@ResponseBody を統合したアノテーションです。View ではなくテキストをそのまま返すコントローラとして設定されます。
@RequestMapping("/") 設定したパスのアクションとしてメソッド index() が設定されます。

src/test/java/hello/HelloControllerTest.java

Mock を利用したテスト

package hello;

import static org.hamcrest.Matchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void getHello() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(content().string(equalTo("Greetings from Spring Boot!")));
    }
}

src/test/java/hello/HelloControllerIT.java

Mock を利用しない Integration テスト

package hello;

import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;

import java.net.URL;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.embedded.LocalServerPort;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HelloControllerIT {

    @LocalServerPort
    private int port;

    private URL base;

    @Autowired
    private TestRestTemplate template;

    @Before
    public void setUp() throws Exception {
        this.base = new URL("http://localhost:" + port + "/");
    }

    @Test
    public void getHello() throws Exception {
        ResponseEntity<String> response = template.getForEntity(base.toString(), String.class);
        assertThat(response.getBody(), equalTo("Greetings from Spring Boot!"));
    }
}

Spring Tool Suite (Eclipse-based IDE)

Spring プロジェクト向けにカスタマイズされた Eclipse が存在します。こちらのページからダウンロードして利用できます。

関連ページ
    概要 Flyway は DB マイグレーションを実現するためのツールです。主に Java を対象としています。Rails におけるマイグレーション機能のようなものです。基本的な使い方をまとめます。 公式ドキュメント Get Started Download Command-line Maven Gradle
    概要 こちらのページで環境構築した Spring Boot でバッチ処理アプリケーションを作成します。内部的に Spring Batch を利用します。CSV ファイルを読み込んで、文字列加工して、MySQL DB に出力するバッチ処理です。 公式ドキュメント Creating a Batch Service
    概要 Swagger は RESTful API の構造をドキュメント化するための仕様および各種周辺ツール等を提供するプロジェクトです。ドキュメント化された情報をもとに、クライアントアプリケーションのソースコードを自動生成したり、Web UI 形式の API 仕様書を公開したりできます。周辺ツールは様々な言語およびフレームワークに対応しており、ここでは特に Java の
    概要 Spring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に、こちらのページに記載の Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。
    概要 こちらのページで開発環境の構築方法をまとめた Spring Boot における OAuth2 のサンプルコードをまとめます。こちらのページで和訳した Twitter API で利用されている OAuth 1.0A と区別します。こちらのページで簡単なサンプルをまとめた Spring Security プロジェクト配下の
    概要 Rails における ERB と同様に、Spring Boot でもテンプレートエンジンを利用できます。今回は特に Thymeleaf (タイムリーフ) のサンプルコードを、こちらのページで構築した環境をもとにまとめます。 公式ドキュメント Serving Web Content with Spring MVC
    概要 こちらのページで使い方を把握した MyBatis を、こちらのページで使い方を把握した Spring Boot で利用するための基本的な設定およびサンプルコードをまとめます。サンプルコードにおいては、特に MySQL を対象とします。 MyBatis Spring-Boot-Starter チュートリアル
    概要 こちらのページで構築した Spring Boot アプリケーションのテストを記述するためには spring-boot-starter-test を利用します。依存ライブラリとして JUnit や Mockito などが利用されています。以下の公式ドキュメントを参考にしつつ簡単な使用方法をまとめます。 チュートリアル
    概要 こちらのページでは、Java のソースコードにハードコーディングしたユーザーとパスワードの情報をもとに、Spring Security でログインフォーム認証を行いました。本ページではユーザー認証を LDAP サーバーからの情報をもとに行います。 Spring LDAP が提供する LDAP クライアントを
    概要 こちらのページで環境を構築した Spring Boot について、非同期処理の基本的な実装方法をまとめます。 関連する公式ドキュメント Creating Asynchronous Methods Scheduling Tasks Consuming a RESTful Web Service Task Execution and Scheduling
    概要 Spring フレームワークにおける @Transactional アノテーションを利用すると DB トランザクション処理が簡単に設定できます。ここでは特に、こちらのページで環境構築した Spring Boot から MyBatis を経由して MySQL を利用する場合を対象としますが、JDBC を利用して他の DB を操作する場合も考え方は同じです。