Spring Boot devtoolsのAutomatic restartについて

# 概要

Spring Bootで開発するアプリケーションにspring-boot-devtoolsを組み込むと、開発が便利になる機能が有効になります。そのうちの1つである"Automatic restart"の設定についてまとめました。


**環境**

* Windows10 Professional
* Java 1.8.0_101
* Spring Boot 1.4.1
 * spring-boot-devtools

**参考**

* [20. Developer tools] (http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html)
* [Appendix A. Common application properties] (http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html)


## Property defaults

devtoolsの初期設定に関するクラス

* [DevToolsPropertyDefaultsPostProcessor] (https://github.com/spring-projects/spring-boot/blob/v1.4.1.RELEASE/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/env/DevToolsPropertyDefaultsPostProcessor.java)
* [DevToolsProperties] (https://github.com/spring-projects/spring-boot/blob/v1.4.1.RELEASE/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/DevToolsProperties.java)
* [RemoteDevToolsProperties] (https://github.com/spring-projects/spring-boot/blob/v1.4.1.RELEASE/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/RemoteDevToolsProperties.java)


## Automatic restart

spring boot devtoolsを組み込むと有効になります。
デフォルトではクラスパス上のファイルの変更をトリガーにしてアプリケーションが再起動します。

### トリガーの有効／無効の切り替え

デフォルトは`true`です。

```yaml
spring:
  devtools:
    restart:
      enabled: true
```

### トリガーの対象外について（デフォルト）

デフォルトは[DevToolsProperties] (https://github.com/spring-projects/spring-boot/blob/v1.4.1.RELEASE/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/autoconfigure/DevToolsProperties.java)で定義されています。
ここで定義されているパターンに当てはまるファイルは再起動のトリガーにはなりません。

```yaml
spring:
  devtools:
    restart:
      exclude: <DevToolsPropertiesを参照>
```

### トリガーの対象から除外する（追加）

デフォルトは未指定です。
再起動のトリガーの対象から除外したいパターンを追加したい場合に指定します。
複数ある場合はカンマ区切りで指定します。
この例では\*.yml、\*.xmlを指定しているので、例えばapplication.ymlを修正してもアプリケーションは再起動しなくなります。

```yaml
spring:
  devtools:
    restart:
      additional-exclude: "**/*.yml, **/*.xml"
```

### トリガーの対象に含める

デフォルトは未指定です。
クラスパス以外のファイルで、再起動のトリガーの対象に含めたいディレクトリを指定します。
複数ある場合は行頭に-を付けて配列で指定します。

```yaml
spring:
  devtools:
    restart:
      additional-paths:
        - src/main/resources/sql
```

### トリガーを特定のファイルに指定する

spring boot devtoolsのデフォルトの状態では、ちょっとした修正を行っただけでもアプリケーションが再起動してしまい、逆に開発を非効率にする場合があります。このような場合には、再起動のトリガーをクラスパス上のファイルではなく特定のファイルに変えることができます。

デフォルトは未指定です。
再起動のトリガーを任意のファイルに指定します。この例では`.reloadtrigger`というファイルを指定しています。
このファイルをクラスパス上(src/main/resources)に配置し、再起動したい場合にこのファイルを変更するとアプリケーションが再起動します。

```yaml
spring:
  devtools:
    restart:
      trigger-file: .reloadtrigger
```

**注意点**

* クラスパス上のファイルの変更が無ければトリガーファイルを更新しても再起動しません。
* トリガーファイルはクラスパス上に配置します。クラスパス以外にある場合はadditional-pathsで追加します。
* トリガーファイルの変更はIDE上から行わないと検知されないようです。コンソールからファイルを更新しても再起動しませんでした。


### Global settings

spring boot devtoolsの設定は、アプリケーションの設定ファイル(application.properties or yml)に記述しますが、開発者個人の設定を反映させたい場合があると思います。
このような場合は、ユーザーホームディレクトリ下に`.spring-boot-devtools.properties`というファイルを作成し、開発者個人の設定を記述することで、反映させることができます。

**たとえば**

application.properties上では再起動が有効になっているが、個人の環境では無効にしたい場合

```properties
spring.devtools.restart.enabled = false
```

application.properties上ではクラスパス上のファイルがトリガーになっているが、任意のファイルをトリガーにしたい場合

```properties
spring.devtools.reload.additional-paths = C:/path/to/directory
spring.devtools.reload.trigger-file = mytrigger
```

**注意点**

* .spring-boot-devtools.ymlというyaml形式では認識されませんでした。