当我想我尝试了很多解决方案时,如何在 Kotlin 和 Gradle 项目中使用 DevTools?

How can work DevTools in Kotlin and Gradle project when I guess I tried a lot of solution?

我想在我的 Spring Boot web 应用程序中使用 DevTools。我使用 IntelliJ。但它不爱我,它不起作用。我阅读了大量关于这个问题的文档,但可能我没有注意到解决方案。也许你能帮帮我。

我使用 Gradle 和 Kotlin。但我认为这应该不是问题。 我尝试了什么:

  1. 在gradle
  2. 中使用devtools依赖
  3. 设置 -> 构建、执行、部署 -> 编译器 -> 我签入 'Build project automatically'
  4. Ctrl + Shift + A -> 注册表... -> 我检查了 'compiler.automake.allow.when.app.running'
  5. 在我的浏览器中 (Chrome) 我按下了 F12 -> 网络 -> 我签入了 'Disable cache'
  6. 我关闭了 AdBlocker

这是我的演示:

build.gradle.kts

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    id("org.springframework.boot") version "2.1.8.RELEASE"
    id("io.spring.dependency-management") version "1.0.8.RELEASE"
    kotlin("jvm") version "1.2.71"
    kotlin("plugin.spring") version "1.2.71"
}

group = "com.example"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_1_8

val developmentOnly by configurations.creating
configurations {
    runtimeClasspath {
        extendsFrom(developmentOnly)
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    developmentOnly("org.springframework.boot:spring-boot-devtools")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "1.8"
    }
}

com.excample.demo.controller.RestController.kt

package com.example.demo.controller

import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
class RestController {

    @RequestMapping("/testDevTools")
    public fun testDev(): String? {
        return "apple"
    }
}

com.excample.demo.DemoApplication.kt

package com.example.demo

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

@SpringBootApplication
class DemoApplication

fun main(args: Array<String>) {
    runApplication<DemoApplication>(*args)
}

当我开始申请时:

  .   ____          _            __ _ _
 /\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.8.RELEASE)

2019-09-19 15:59:15.727  INFO 6672 --- [  restartedMain] com.example.demo.DemoApplicationKt       : Starting DemoApplicationKt on DESKTOP-QRT95S2 with PID 6672 (started by Baráth Péter in C:\Users\Baráth Péter\OneDrive - Sonrisa Kft\Projects\Demos\devToolsDemo)
2019-09-19 15:59:15.731  INFO 6672 --- [  restartedMain] com.example.demo.DemoApplicationKt       : No active profile set, falling back to default profiles: default
2019-09-19 15:59:15.890  INFO 6672 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2019-09-19 15:59:15.890  INFO 6672 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2019-09-19 15:59:19.376  INFO 6672 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 9090 (http)
2019-09-19 15:59:19.430  INFO 6672 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-09-19 15:59:19.431  INFO 6672 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.24]
2019-09-19 15:59:19.666  INFO 6672 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-09-19 15:59:19.666  INFO 6672 --- [  restartedMain] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 3776 ms
2019-09-19 15:59:20.205  INFO 6672 --- [  restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-09-19 15:59:20.878  WARN 6672 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : Unable to start LiveReload server
2019-09-19 15:59:21.004  INFO 6672 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 9090 (http) with context path ''
2019-09-19 15:59:21.018  INFO 6672 --- [  restartedMain] com.example.demo.DemoApplicationKt       : Started DemoApplicationKt in 6.16 seconds (JVM running for 7.234)
2019-09-19 15:59:45.492  INFO 6672 --- [nio-9090-exec-3] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-09-19 15:59:45.493  INFO 6672 --- [nio-9090-exec-3] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2019-09-19 15:59:45.502  INFO 6672 --- [nio-9090-exec-3] o.s.web.servlet.DispatcherServlet        : Completed initialization in 9 ms

它包含这一行:

2019-09-19 15:59:15.890  INFO 6672 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable

所以我不知道是什么问题。开发工具处于活动状态。 我试图在 RestController 中更改苹果字符串。然后保存并刷新网页,它没有改变。 我非常感谢任何建议。

您引用的设置 "Build project automatically" 仅适用于 IntelliJ 自己的编译器。如果您将构建委托给 Gradle,这是较新版本的 IntelliJ 中的默认设置,它实际上 不会 自动构建您的项目。

devtools 模块只会在重新编译时重新加载 类。因此,当您准备好重新加载时,您可以点击 "Build Project" 按钮以使用 Gradle 触发构建。但由于这还将 运行 单元测试,甚至可能是静态代码分析(如果你正在使用它),周转时间仍然相当长。您可以手动 运行 带有 Gradle 的 classes 任务只编译 类,但是手动这样做很烦人。

相反,要用 Gradle 连续编译你的 类,并且仅此而已,运行 终端中的这个命令(假设你使用包装器):

gradlew -t classes

它将监视文件系统的更改并重新运行 classes 更改任务。因此,每当您对源文件进行更改并保存它时,Gradle 将重新编译它并且 devtools 模块应该获取更改并重新加载它。