Java tips - GradleでSpringBootプロジェクトを作成する

# GradleでSpringBootプロジェクトを作成する
昨今はeclipseなどワンクリックでSpringBootプロジェクトが作成できる時代です。
しかし、eclipseの力を借りずにSpringBootプロジェクトを作成するのはどうすればいいのかと
思い、備忘録ベースでRestControllerでHelloWorldを返すところまで書いて行きたいと思います。
(eclipseを使わない訳ではないです。)

# 環境
Macで以下のものを導入して実行しています。
- Gradle 5.5.1
- JDK openjdk64-11.0.4
- eclipse 201906

# 目次
1. Gradleプロジェクト作成
2. eclipseインポート
3. SpringBootの依存関係整理
4. Javaクラス作成
5. Jar作成

# 本節
## 1. Gradleプロジェクト作成
まず、空のディレクトリを作成してGradleプロジェクトを作成していきます。

```bash
# 空のディレクトリ作成
mkdir GradleSpringBoot

# Gradleプロジェクト化
cd GradleSpringBoot
gradle init

# initコマンドを打ち込んだら、以下のような選択肢たちが出てくるので該当するのを選んでいきます。
# 今回はJavaのプロジェクトとなるように選択していきます。
Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4] 2

Select implementation language:
  1: C++
  2: Groovy
  3: Java
  4: Kotlin
Enter selection (default: Java) [1..4] 3

Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Groovy) [1..2] 1

Select test framework:
  1: JUnit 4
  2: TestNG
  3: Spock
  4: JUnit Jupiter #JUnit5のことです。理由がなければ、JUnit5を新しいので選びましょう。
Enter selection (default: JUnit 4) [1..4] 4
```

## 2. eclipseインポート
作成したGradleプロジェクトをeclipseにインポートできるようにbuild.gradleを書き換えます。

```gradle
    id 'application'
// 15行目あたりに以下のプラグインを追加しましょう。
    id 'eclipse'
```

編集して保存したら、以下のコマンドを実行しましょう。

```bash
# eclipseプロジェクトと認識するために必要な「.project」「.setting」を作成します。
gradle eclipse
```

ここまできたら、eclipseにインポートできるので、
import->existing projects into workspaceでインポートしてみましょう。

## 3. SpringBootの依存関係整理
SpringBootの依存関係は[Gradle公式サイト](https://guides.gradle.org/building-spring-boot-2-projects-with-gradle/)がまとめていてくれているので、こちらを参考にbuild.graleを編集します。


```gradle:build.gradle
/*
 * This file was generated by the Gradle 'init' task.
 *
 * This generated file contains a sample Java project to get you started.
 * For more details take a look at the Java Quickstart chapter in the Gradle
 * User Manual available at https://docs.gradle.org/5.5.1/userguide/tutorial_java_projects.html
 */

plugins {
    // Apply the java plugin to add support for Java
    id 'java'

    // Apply the application plugin to add support for building a CLI application
    id 'application'
    id 'eclipse'
    id 'com.gradle.build-scan' version '2.3'
    id 'org.springframework.boot' version '2.1.6.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
}

repositories {
    // Use jcenter for resolving dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}

dependencies {
    // This dependency is used by the application.
    implementation 'com.google.guava:guava:27.1-jre'
    
    implementation 'org.springframework.boot:spring-boot-dependencies:2.1.6.RELEASE'
    implementation 'org.springframework.boot:spring-boot-starter-web:2.1.6.RELEASE'

	// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test
	testImplementation 'org.springframework.boot:spring-boot-starter-test:2.1.6.RELEASE'

    // Use JUnit Jupiter API for testing.
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.4.2'

    // Use JUnit Jupiter Engine for testing.
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.4.2'
    
    components {
        withModule('org.springframework:spring-beans') {
            allVariants {
                withDependencyConstraints {
                    // Need to patch constraints because snakeyaml is an optional dependency
                    it.findAll { it.name == 'snakeyaml' }.each { it.version { strictly '1.19' } }
                }
            }
        }
    }
}

bootJar {
    mainClassName = 'co.jp.study.App'
}

buildScan {

    // always accept the terms of service
    termsOfServiceUrl = 'https://gradle.com/terms-of-service'
    termsOfServiceAgree = 'yes'

    // always publish a build scan
    publishAlways()
}

test {
    // Use junit platform for unit tests
    useJUnitPlatform()
}
```

各ライブラリのversionはmavenで確認しながら最新のもの(2019/7/26時点)を設定しています。

## 4. Javaクラス作成
SpringBootを起動するためのPOJOクラスとHelloWorldを返すためのRestControllerを作成していきます。

```java:App.java
package co.jp.study;

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

/**
 * SpringBoot起動クラス
 */
@SpringBootApplication
public class App {
	public static void main(String[] args) {
		SpringApplication.run(App.class, args);
	}
}
```

```java:HelloController
package co.jp.study.controller;

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

/**
 * サンプルRestControllerクラス
 */
@RestController("/")
public class HelloContoller {

	@RequestMapping
	public String hello() {
		return "Hello World!";
	}

}
```

## 5. Jar作成
コンソールで以下のコマンドを実行siteiki、Jarを作成してSpringBootを起動していきます。

```bash

# jarの作成
gradle bootJar
# 実行
gradle bootRun
```

以下のアドレスにアクセスして「HelloWorld」と出力されたら成功です。
http://localhost:8080/


# まとめ
お疲れ様でした。長い文章を見ていただきありがとうございました。
快適なSpringBoot開発を送っていきましょう。