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

Pét*_*áth 1 devtools gradle kotlin spring-boot

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

我使用 Gradle 和 Kotlin。不过我觉得应该问题不大。我试过的:

  1. 我在 gradle 中使用 devtools 依赖
  2. 设置 -> 构建、执行、部署 -> 编译器 -> 我检查了“自动构建项目”
  3. Ctrl + Shift + A -> Registry... -> 我检查了'compiler.automake.allow.when.app.running'
  4. 在我的浏览器 (Chrome) 中,我按F12 -> 网络-> 我检查了“禁用缓存”
  5. 我关闭了 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"
    }
}
Run Code Online (Sandbox Code Playgroud)

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"
    }
}
Run Code Online (Sandbox Code Playgroud)

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)
}
Run Code Online (Sandbox Code Playgroud)

当我开始申请时:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: 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
Run Code Online (Sandbox Code Playgroud)

它包含这一行:

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
Run Code Online (Sandbox Code Playgroud)

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

Bjø*_*ter 7

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

devtools 模块只会在重新编译时重新加载类。因此,只要您准备好重新加载以触发 Gradle 构建,就可以点击“构建项目”按钮。但是由于这也将运行单元测试,甚至可能是静态代码分析(如果您正在使用它),周转时间仍然会相当长。您可以classes使用 Gradle手动运行任务以仅编译类,但手动执行此操作很烦人。

相反,要使用 Gradle 持续编译您的类,仅此而已,请在终端中运行此命令(假设您使用包装器):

gradlew -t classes

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