LoginSignup
1
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-02-19

問題

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

解決策

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

解説

参考)
[Java] Spring BootでHello World!(入門編) | マリンロード

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

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

image.png

image.png

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

後はデフォルトのまま

image.png

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

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

image.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

image.png

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

image.png

image.png

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

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

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

image.png

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

image.png

image.png

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

1
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
6