visual studio code で hotswap できない

投稿者: Anonymous

ネットをあさるとIntelliJでhotswapしている例が出てくるのですが、visual studio codeで解決している例はありませんでした。

そもそも、spring-boot-devtoolsspringloaded があれば実現できそうなので、IntelliJだろうがvisual studio codeであろうがどちらでもよいと思ったのですが、違うのでしょうか?
また、言語はKotlinを使用しています。

設定抜粋

build.gradle.kts

dependencies {
    ...
    runtimeOnly("org.springframework.boot:spring-boot-devtools")
    runtimeOnly("org.springframework:springloaded:1.2.6.RELEASE")
    ...
}

application.properties

...
spring.thymeleaf.cache=false
...

上記設定後、@Controller内にprint文を付け足し、ファイルを保存、ページをリロードしましたが、printの結果は出力されませんでした。もちろん手動でspringの再起動後は出力されました。なので、hotswapはできておりません。

関係あるとすると 20. Developer tools にリスタートの方法がIntelliJとEclipseで違うようなので、visual studio codeではどのようにするのか?という質問になるかもしれません。

ちなみに build.gradle.kts 末尾に

bootRun {
    addResources = true
}

を足すと以下のエラーが起こってしまいます。

Expression 'bootRun' cannot be invoked as a function.

回答を受けてバージョンに関する追記:

build.gradle.kts

plugins {
    id("org.springframework.boot") version "2.2.5.RELEASE"
    id("io.spring.dependency-management") version "1.0.9.RELEASE"
    kotlin("jvm") version "1.3.61"
    kotlin("plugin.spring") version "1.3.61"
}

解決

おそらくSpring Boot バージョン 1.x と 2.x で事情が異なるのでバージョンを明記した方が良いかと考えます。


私がSpring Bootを利用し始めたのは 2.1 以降なのでそれ以前のことについては誤解を含んでいるかもしれませんが、私が理解している限り、Spring Bootでホットスワッピングができたのは 1.x の頃の話です。
これを実現するのに利用していたspring-loadedは、2.xではサポートされていません:

As the Spring Loaded project has been moved to the attic, its support has been removed. We advise to use Devtools instead.

2.x で実現するにはJRebel(など)といった、Springプロジェクト外の一般的なJava向けプロダクトが必要になります。

2.xで利用可能なspring-boot-devtoolsで実現できるのはいわゆるホットスワッピングでなく“賢いリスタート”です。ざっくり言うとファイルの変更を検知してサーバを再起動する機能です。


以下2.xを前提に記述します。
Gradleで spring-boot-devtoolsを利用してJava/Kotlinファイルの変更検知を反映するには、自前で再コンパイルする必要があるようです
これは通常IDEが肩代わりしてくれる(保存すれば自動で再コンパイルが走る)はずですが、VSCode+Kotlinでそのような仕組みがあるのかは私は知りません。
無いのであれば、Gradleのcontinuous build supportを利用することもできます:

gradle -t build

ちなみに build.gradle.kts 末尾に

bootRun {
    addResources = true
}

を足すと以下のエラーが起こってしまいます。

Expression 'bootRun' cannot be invoked as a function.

addResourcesは2.xではもはや存在しておらず、また、Kotlin DSL では書き方が異なります:

import org.springframework.boot.gradle.tasks.run.BootRun

...
tasks.getByName<BootRun>("bootRun") {
    sourceResources(sourceSets["main"])
}

build.gradle.kts の書き方については、 spring initializr で生成されるテンプレートを参考にするのが良いかと思います。

コードサンプル

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *