GradleでSpringBootプロジェクトを始める

## 環境
Windows10 64bit
JDK 11

## Spring Initializrからひな形をダウンロード

まずは、下記のページからSpringプロジェクトのひな形をダウンロードする。
画像のように、Mavenではなく、Gradleにチェックを入れておく。

https://start.spring.io/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628798/b75ef896-fd2a-cb65-ca70-15968d7137ef.png)


ダウンロードして、展開したディレクトリは下記のようになっている。

```powershell

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2020/04/29     23:48                gradle
d-----        2020/04/29     23:48                src
-a----        2020/04/29     23:48            341 .gitignore
-a----        2020/04/29     23:48            509 build.gradle
-a----        2020/04/29     23:48           5764 gradlew
-a----        2020/04/29     23:48           3056 gradlew.bat
-a----        2020/04/29     23:48            469 HELP.md
-a----        2020/04/29     23:48             26 settings.gradle
```

## Gradle関係のディレクトリ・ファイル

プロジェクト内には、下記のようなGradle関連のファイル・ディレクトリが含まれている。

- ```.gradle``` ... Gradleが生成するキャッシュが保存されているディレクトリ
- ```gradle``` ... Gradleラッパーの設定ファイル / Jarファイルが配置されているディレクトリ
- ```build.gradle``` ... ビルドスクリプト、大体これを触ることになる
- ```gradlew``` ... Gradleラッパーのシェルスクリプト
- ```gradlew.bat``` ... Gradleラッパーのバッチファイル
- ```settings.gradle``` ... マルチプロジェクト時のビルドに必要な設定ファイル

## Gradleラッパー

Spring Initializrを使う場合は、すでにプロジェクトにGradle Wrapperが含まれている。
なので、開発者がGradleそのものを手動でインストールする必要はない。
DLしたプロジェクトをIntellijなどのIDEで開くと、自動で所定のバージョンのGradleがインストールされる。
こうした配布の仕方をすることで、チームで使用されるGradleのバージョンを統一することができる。

## IntelliJへの統合

IntelliJのGradleプラグインはデフォルトでインストールされているので、IDEのプラグインの追加は不要。
画面右側にGradleタブがあり、Gradle周りの操作はIntelliJ内で完結させることができる。
下のようにタスク一覧が表示されており、象さんマークのボタンから各タスクを実行することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628798/db425bc9-dd78-1d83-5158-daf9e1cd259c.png)



## ビルドスクリプト

```gradle:build.gradle

plugins {
  id 'org.springframework.boot' version '2.2.6.RELEASE'
  id 'io.spring.dependency-management' version '1.0.9.RELEASE'
  id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
  mavenCentral()
}
dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-web'
  testImplementation('org.springframework.boot:spring-boot-starter-test') {
    exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
  }
}
test {
  useJUnitPlatform()
}
```

## プラグイン

```gradle

plugins {
	id 'org.springframework.boot' version '2.2.6.RELEASE'
	id 'io.spring.dependency-management' version '1.0.9.RELEASE'
	id 'java'
}
```

`build.gradle`を見ると、上記のようにプラグインが最初から導入されている。
Gradleのプラグインとは、開発でよく使われるタスクを予め定義してくれている拡張のこと。
例えば、`java`プラグインであれば、ビルド、テスト、Javadocの生成などのタスクを予め用意してくれる。
下記のページで様々なプラグインが公開されているが、もちろんプラグインを自作することも可能。

https://plugins.gradle.org/

## リポジトリ
```gradle
repositories {
  mavenCentral()
}
```

Gradleはライブラリの依存関係を外部・内部のリポジトリから取得する。
上記では、`mavenCentral`を指定しているので、依存関係を追加した場合はここから取得することになる。
他にも`jCenter`や`google`のリポジトリなどもあるので、そちらを指定することもできる。
リポジトリ間の優先順位を決めておいて、Aにない場合はBから取得という指定の仕方もできる。
`Nexus`等を利用し自前で建てたプライベートリポジトリを指定することも可能。

## 依存関係

デフォルトでは下記のようになっている。

```gradle

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-web'
  testImplementation('org.springframework.boot:spring-boot-starter-test') {
    exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
  }
}
```

`implementation`はアプリケーションのソースをコンパイルする時に必要な依存関係。
`testImplementation`はテストソースをコンパイルし、テスト実行するのに必要な依存関係。
他にも様々なコンフィグレーションの依存関係を設定することができる。
`build.gradle`に依存関係を追加すると、IntelliJが変更を検出し、リポジトリから依存関係を取得する。

## テスト
```gradle
test {
  useJUnitPlatform()
}
```
最初は上記のようになっており、テストを実行すると全てのテストが走る状態。
`useJUnitPlatform`ブロック内で、JUnitの機能を使用し、テストの細かな制御を行うことができる。
例えば、特定のタグが付けられたテストメソッドをincludeしたり、excludeしたりできる。