「Gradle」Spring Bootアプリケーションをビルドしてみる

前々から使ってみたいと思っていた Spring Boot やっと触りました。 今回は Gradle 使って簡単なアプリケーションをビルドするところまでをやります。

下記のガイドに従って進めました。(ほぼそのままの内容・・・)

・Building Spring Boot 2 Applications with Gradle

1. Java プロジェクトの作成

まずは、Gradle で Java プロジェクトを作成します。gradle init で type に java-application を指定して作成します。

C:\> mkdir C:\devspace\gradle\project\spring-boot-test
C:\> cd C:\devspace\gradle\project\spring-boot-test
C:\devspace\gradle\project\spring-boot-test> gradle init  --type java-application
C:\devspace\gradle\project\spring-boot-test> dir
 ドライブ C のボリューム ラベルは Windows です
 ボリューム シリアル番号は 0659-09F6 です

 C:\devspace\gradle\project\spring-boot-test のディレクトリ

2018/12/01  11:00    <DIR>          .
2018/12/01  11:00    <DIR>          ..
2018/12/01  10:48             1,298 .classpath
2018/12/01  10:42               108 .gitignore
2018/12/01  10:46    <DIR>          .gradle
2018/12/01  10:48               640 .project
2018/12/01  10:48    <DIR>          .settings
2018/12/01  10:48    <DIR>          bin
2018/12/01  11:01    <DIR>          build
2018/12/01  11:00             1,261 build.gradle
2018/12/01  10:42    <DIR>          gradle
2018/12/01  10:42             5,305 gradlew
2018/12/01  10:42             2,269 gradlew.bat
2018/12/01  10:46               419 settings.gradle
2018/12/01  10:42    <DIR>          src


2. build.gradle などの設定を編集

ガイドに従って build.gradle などの設定ファイルを編集します。

・build.gradle

plugins {
    id 'java'
    id 'application'
    id 'com.gradle.build-scan' version '1.16'
    id 'org.springframework.boot' version '2.0.5.RELEASE'
}

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

repositories {
    jcenter()
}

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

    testImplementation 'junit:junit:4.12'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    components {
        withModule('org.springframework:spring-beans') {
            allVariants {
                withDependencyConstraints {
                    it.findAll { it.name == 'snakeyaml' }.each { it.version { strictly '1.19' } }
                }
            }
        }
    }
}

mainClassName = 'spring.boot.test.App'

bootJar {
    mainClassName = 'spring.boot.test.App'
}

・setting.gradle

rootProject.name = 'spring-boot-test'
enableFeaturePreview('IMPROVED_POM_SUPPORT')


3. Spring Boot アプリケーションの作成

プロジェクト作成時に生成された App.java などを Spring Boot アプリケーションに書き換えます。

・App.java

package spring.boot.test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App {

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


・HelloGradleController.java

package spring.boot.test;

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

@RestController("/")
public class HelloGradleController {

    @GetMapping
    public String helloGradleGet() {
        return "[GET] Hello Gradle!";
    }

    @PostMapping
    public String helloGradlePost() {
        return "[POST] Hello Gradle!";
    }
}


/ に対して GET リクエストが来たら helloGradleGet、POST リクエストが来たら helloGradlePost が呼び出されるコントローラにしてみました。

テストコードも修正しておきます。

・AppTest.java

package spring.boot.test;

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.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import javax.swing.text.AbstractDocument.Content;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class)
@AutoConfigureMockMvc
public class AppTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void helloGradleGet() throws Exception {
        mvc.perform(get("/"))
            .andExpect(status().isOk())
            .andExpect(content().string("[GET] Hello Gradle!"));
    }

    @Test
    public void helloGradlePost() throws Exception {
        mvc.perform(post("/"))
            .andExpect(status().isOk())
            .andExpect(content().string("[POST] Hello Gradle!"));
    }
}


4. ビルド、アプリケーションの実行

gradlew bootJargradlew bootRun でビルド、実行します。

C:\devspace\gradle\project\spring-boot-test>.\gradlew bootJar
C:\devspace\gradle\project\spring-boot-test>.\gradlew bootRun


http://localhost:8080 で起動してくるので、GET、POST でアクセスしてみます。

$ curl http://localhost:8080
[GET] Hello Gradle!
$ curl http://localhost:8080 -X POST
[POST Hello Gradle!

ちゃんと意図通りのメソッドが呼び出されました。

今回の動作確認は VS Code 上でやりましたが、さすがしんどいので次回は Eclipse プロジェクトを作成して Eclipse 上で作業できるようにしたいと思います。

以上です。

[環境情報]
Windows 10
Java SE 8 Update 152
Gradle 5.0
Spring Boot 2.0.5.RELEASE