spring-boot-devtools + gradle を Eclipse で動かすと、ClassCastException

# 問題

1. Spring boot devtools + gradle を Eclipse で 「Spring Boot アプリケーション」として実行すると、`ClassCastException` が発生する
2. gradleから「bootRun」で実行すると、起動は成功するが、コードの変更が反映されない

# 解決策

1. gradleの「bootRun」で起動する
2. プロジェクトの「自動的にビルド」にチェック
3. 「Javaのビルド・パス」をgradleのビルド先に合わせる

# 解説

参考)
[[Java] Spring BootでHello World!（入門編） | マリンロード](https://www.marineroad.com/staff-blog/16785.html)

## 1. スタータープロジェクトの作成

まずは、SpringBootのスタータープロジェクトを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184714/96cb844d-1f51-cbe1-c582-4b49a90449ab.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184714/18424787-d0e9-a9f0-b3b9-ceb050e222e5.png)

 - 型: Gradle(Buildship 2.x)
 - パッケージング: war
 - Javaバージョン: 8
 - 言語: Java

後はデフォルトのまま

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184714/fd03e7c6-4680-ab1b-e5a1-76c8f43d4502.png)

 - Spring Boot Version: 1.5.10
 - DevTools
 - Thymeleaf
 - Web

依存関係として、上記のみを選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184714/994bc1a5-e32c-5df3-d9b2-50cb8fbb732a.png)

 - ベースURL: `http://start.spring.io/starter.zip`
 - 完全URL: `http://start.spring.io/starter.zip?name=demo03&groupId=com.example&artifactId=demo03&version=0.0.1-SNAPSHOT&description=Demo+project+for+Spring+Boot&packageName=com.example.demo&type=gradle-project&packaging=war&javaVersion=1.8&language=java&bootVersion=1.5.10.RELEASE&dependencies=devtools&dependencies=thymeleaf&dependencies=web`

## 2. HelloController.javaの作成

スタータープロジェクトが出来たら、`HelloController` を追加します。

```HelloController.java
@RestController
public class HelloController {

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

}
```

## 3.  「Spring Boot アプリケーション」として実行

プロジェクトを右クリックして出てくる「Spring Boot アプリケーション」を実行します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184714/f9263293-9036-9004-bf47-0499fca16b47.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184714/cf509f23-589c-e85e-cdc1-ee84ac4ae419.png)

```stacktrace
Exception in thread "main" java.lang.ClassCastException: java.base/jdk.internal.loader.ClassLoaders$AppClassLoader cannot be cast to java.base/java.net.URLClassLoader
	at org.springframework.boot.devtools.restart.DefaultRestartInitializer.getUrls(DefaultRestartInitializer.java:93)
	at org.springframework.boot.devtools.restart.DefaultRestartInitializer.getInitialUrls(DefaultRestartInitializer.java:56)
	at org.springframework.boot.devtools.restart.Restarter.<init>(Restarter.java:140)
(略)
```

щ(ﾟﾛﾟщ) ｵｰﾏｲｶﾞｰｯ!!
…ってのが、今回の発端です。Java9で `ClassCastException` が起きるってのは調べたらよく出てきたのですが、今回はJava8だし…
で、次に試したのが、そもそもgradleプロジェクトなんだから、gradleから起動したらいけんじゃね？って事。


## 4.  gradleの「bootRun」で実行する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184714/3e392ee3-0405-31ef-164b-ce861424e438.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184714/e7094101-8c91-8602-cd7c-b2ffe7c96084.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184714/1de10774-9210-5656-a89f-17665fcdfefa.png)

(*^-ﾟ)vｨｪｨ♪
うまくいきましたー！…って思ったのもつかの間。
ソースコードを修正しても即反映されない…… orz
もちろんgradleタスクを止めて、再度実行すれば反映されますが、せっかく `DevTools` を使ってるんだから、即時反映させたい！
そして試行錯誤することしばし……

## 5.  プロジェクトのビルドパスを変更する

試行錯誤の結果、ソースコードを保存した時の自動ビルドパスが、gradleのビルドパスと合ってない事に気づきました。
Eclipseのビルドパスの設定を何も変えていないと、 `bin` ディレクトリ以下にビルド結果が保存されるようです。
これを gradle のビルドに合わせて変えてみたら……？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184714/3db64fcb-fcb0-ea3e-27c6-7aca67623601.png)

`src/main/java`
 　…　出力フォルダ: `build/classes/main`
`src/main/resources`
 　…　出力フォルダ: `build/resources`
`src/test/java`
 　…　出力フォルダ: `build/classes/test`


![image.png](https://qiita-image-store.s3.amazonaws.com/0/184714/33ccbc3c-c2b3-ba12-3d74-d28a6cc1cd05.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184714/fd324d9d-27fc-2992-b06a-a67883c9b5c2.png)

☆(*^o^)乂(^-^*)☆ ﾔｯﾀﾈ!!
ソースコードを保存したら、即時反映されるようになりました！
※resourcesの下は確認してないので、パスが間違ってたらすみません。