66651


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

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

## 設定抜粋

### build.gradle.kts

[code]

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

### application.properties

[code]

    ...
    spring.thymeleaf.cache=false
    ...
    
[/code]

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

関係あるとすると [20\. Developer tools](https://docs.spring.io/spring-
boot/docs/1.3.1.RELEASE/reference/html/using-boot-devtools.html#using-boot-
devtools-restart) にリスタートの方法がIntelliJとEclipseで違うようなので、visual studio
codeではどのようにするのか？という質問になるかもしれません。

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

[code]

    bootRun {
        addResources = true
    }
    
[/code]

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

[code]

    Expression 'bootRun' cannot be invoked as a function.
    
[/code]

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

### build.gradle.kts

[code]

    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"
    }
    
[/code]


CC BY-SA 4.0
2020-05-14T23:08:35.510
66615
2020-05-16T03:00:43.943
2020-05-16T01:55:27.977
9008
9008
question
spring kotlin spring-boot
visual studio code で hotswap できない


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

* * *

私がSpring Bootを利用し始めたのは 2.1 以降なのでそれ以前のことについては誤解を含んでいるかもしれませんが、私が理解している限り、Spring
Bootでホットスワッピングができたのは 1.x の頃の話です。  
これを実現するのに利用していた[`spring-loaded`は、2.xではサポートされていません](https://github.com/spring-
projects/spring-boot/wiki/Spring-Boot-2.0.0-M1-Release-Notes#spring-loaded):

> 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(など)](https://docs.spring.io/spring-
boot/docs/2.3.0.RELEASE/reference/htmlsingle/#using-boot-hot-
swapping)といった、Springプロジェクト外の一般的なJava向けプロダクトが必要になります。

2.xで利用可能な`spring-boot-
devtools`で実現できるのはいわゆるホットスワッピングでなく["賢いリスタート"](https://docs.spring.io/spring-
boot/docs/2.3.0.RELEASE/reference/htmlsingle/#howto-reload-fast-
restart)です。ざっくり言うとファイルの変更を検知してサーバを再起動する機能です。

* * *

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

[code]

    gradle -t build
    
[/code]

* * *

> ちなみに `build.gradle.kts` 末尾に
[code]

>     bootRun {
>         addResources = true
>     }
>  
[/code]

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

>     Expression 'bootRun' cannot be invoked as a function.
>  
[/code]

[`addResources`は2.xではもはや存在しておらず](https://stackoverflow.com/a/46234266/4506703)、また、[Kotlin
DSL では書き方が異なります](https://docs.spring.io/spring-boot/docs/current/gradle-
plugin/reference/html/#running-your-application-reloading-resources):

[code]

    import org.springframework.boot.gradle.tasks.run.BootRun
    
    ...
    tasks.getByName<BootRun>("bootRun") {
        sourceResources(sourceSets["main"])
    }
    
[/code]

* * *

`build.gradle.kts` の書き方については、 [spring initializr](https://start.spring.io/)
で生成されるテンプレートを参考にするのが良いかと思います。

[コードサンプル](https://github.com/yukihane/stackoverflow-qa/tree/master/so66615)


CC BY-SA 4.0
2020-05-15T23:44:23.887
66651
2020-05-16T03:00:43.943
2020-05-16T03:00:43.943
2808
2808
66615
answer