IntelliJ 15,SpringBoot devtools livereload无法正常工作

问题描述 投票:40回答:10

使用Spring Boot devtools 1.3解决了新的LiveReload功能问题。它不会在类更改时重新加载。我已经看到它使用IntelliJ @ Devoxx 2015进行了演示。是否需要启用一些IDE设置?我正在通过IDE运行,而不是通过Gradle运行。我尝试启用“自动生成项目”,这似乎没有帮助。

它似乎正确加载并正在寻找正确的路径

2015-11-23 05:55:30.592 DEBUG 4700 --- [  restartedMain] o.s.boot.devtools.restart.Restarter      : Starting application com.myapp.Application with URLs [file:/E:/Projects/myapp/build/classes/main/, file:/E:/Projects/myapp/build/resources/main/]

我的文件

的build.gradle

buildscript {
    ext {
        springBootVersion = '1.3.0.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
    }
}

apply plugin: 'java'
apply plugin: 'eclipse-wtp'
apply plugin: 'idea'
apply plugin: 'spring-boot' 
apply plugin: 'war'


war {
    baseName = 'myapp'
    version = '0.0.1-SNAPSHOT'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/snapshot" }
    maven { url "https://repo.spring.io/milestone" }
}

configurations {
    providedRuntime
}

dependencies {
    compile('org.springframework.boot:spring-boot-starter-actuator')
    compile('org.springframework.boot:spring-boot-devtools')
    compile('org.springframework.boot:spring-boot-starter-jdbc')
    compile('org.projectlombok:lombok')
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('net.sourceforge.jtds:jtds:1.3.1');
    testCompile('org.springframework.boot:spring-boot-starter-test') 
}

dependencyManagement {
    imports { 
        mavenBom "org.springframework.cloud:spring-cloud-starter-parent:Brixton.M3" 
    }
}


eclipse {
    classpath {
         containers.remove('org.eclipse.jdt.launching.JRE_CONTAINER')
         containers 'org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8'
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.7'
}

HelloWorldController

@Controller
public class HelloWorldController {

    @RequestMapping("/")
    @ResponseBody
    String home(){

        return "Hello World test";
    }
}
intellij-idea spring-boot
10个回答
33
投票

我猜你正在编码并希望DevTools自动神奇地弄清楚你在项目中改变了什么? Devtools通过观察你的classpath文件夹来做到这一点。当.class文件(或资源)发生变化时,devtools采取适当的行动。

如果你没有看到任何东西,那可能是因为你只是编码而不是更新类路径。您必须调用Make Project来更新类路径。见the documentation


0
投票

这对我有用。在application.properties文件中添加以下行,

    spring.devtools.restart.enabled=true

25
投票

要解决这个问题你可以这样做:

  1. 在浏览器中添加LiveReload扩展程序。
  2. 将devtools依赖项添加到您的pom.xml(如果它是maven(spring-boot-devtools))。
  3. 在您的intellij IDEA中,转到:file-> settings-> build,execution,deployment。自动转到 - > compiler-> build project。
  4. 在您的intellij IDEA中:SHIFT + Ctrl + A - > registry-> compiler.automake.allow.when.app.running

15
投票

如果你使用IntelliJ IDEA,添加spring-boot-devtools是不够的。这是因为与Eclipse不同,您需要明确告诉IntelliJ IDEA“Make The Project”以使其构建到目标类路径。

see on youtube

最简单的解决方案:运行app调试模式并按Ctrl + f9(构建的快捷方式)

要么

  1. 您需要启用“自动生成项目”选项。您可以在“设置 - 构建,执行,部署 - 编译器”中找到它
  2. 要打开注册表,只需按SHIFT + CTRL + A.在注册表窗口中,启用“compiler.automake.allow.when.app.running”复选框。

build-project-automatically

compiler-automake-allow-when-app-running


11
投票

LiveReload和重启是不同的功能。 Livereload允许您检测resources/static文件夹中的更改,并通知浏览器文件已更改并应重新加载页面。

您的问题描述了重启场景。如果您希望应用程序在* .class-files更改时自动重新加载,请确保您的IDE将编译后的类转换为:

build\classes\main

在Intellij中转到项目结构(Ctrl + Alt + Shift + S)并设置项目编译器输出目录。在此之后,您可以在类中进行更改,然后按Ctrl + Shift + F9重新编译当前类,或按Ctrl + F9重新编译整个项目。 Spring Boot Devtools将检测build\classes\main中的更改并自动重启您的应用程序。

如果要为静态资源启用LiveReload,请添加以下内容(否则在执行bootRun目标时不会看到静态内容的变化):

bootRun {
    addResources = true
}

6
投票

按照以下简单步骤,您将在不到2分钟内启动并运行。

  1. 按Ctrl + Shift + A.
  2. 搜索注册表...
  3. 滚动并找到“compiler.automake.allow.when.app.running”,然后选中复选框以使其处于活动状态。
  4. 点击关闭
  5. 文件菜单 - >设置...
  6. 展开构建,执行,部署
  7. 选择编译器
  8. 选择复选框自动构建项目
  9. 应用
  10. 单击确定

现在停止应用程序服务器,然后启动应用程序,即在项目中检测到任何更改时,您将发现自动重启/重新加载。

快乐的编码/黑客。


5
投票

来自文档here

由于DevTools监视类路径资源,因此触发重新启动的唯一方法是更新类路径。导致更新类路径的方式取决于您使用的IDE。在Eclipse中,保存修改后的文件将导致更新类路径并触发重新启动。在IntelliJ IDEA中,构建项目(Build→Make Project)将具有相同的效果。


2
投票

要回答上述问题,我们首先要了解Intellij Idea中的一个功能。您必须已经看到无需保存更改的文件。并且您在任何非.class文件中所做的更改仍会保存。要交叉验证,请对.java文件进行一些更改(您也可以选择任何其他文件)并关闭它,它不会提示保存它,当您重新打开文件时,您的更改仍然存在。但是如果你检查.class文件,那么所做的更改就不会被反映出来,这是显而易见的,因为没有发生构建。相反,当我们在Eclipse中启用自动构建时,它将在事件上完成,事件是保存文件 - > Ctrl + S(Windows)。但是在intellij想法中事件没有发生或者我们没有执行那个事件。因此,考虑当我们没有spring-boot-devtool时的情况,在这种情况下,我们总是不得不重建或重新启动服务器以获取更改,从而导致事件。现在,关于spring-boot-devtool,正如Ankush92正确地提到devtool监视类路径更改并且只有在类路径中有任何更改时才会重新启动。但正如我之前解释的那样,我们只是在非.class文件中添加我们的代码更改,并期望devtool触发重启,即使该更改未反映在类路径中也是如此。让我再次提到这一点,在eclipse中,执行相同操作的事件是在启用自动构建时保存文件(Ctrl + S)。所以,现在问题是如何有一个解决方法并模仿Ctrl + S在Eclipse中对Intellij Idea的作用。构建应用程序非常简单,快捷方式是Ctrl + F9。这将在intellij中触发与eclipse中的Ctrl + S(在此场景中)相同的效果,并帮助devtool在类路径中找到更改,从而鼓励它重新启动服务器。因此,每次在文件中进行任何更改并希望服务器重新启动时,只需按Ctr + F9即可。我希望这个解释和解决方法有所帮助。


1
投票
Edit - Macros - Start Macro Recording
File - Save All
Build - Build Project
Edit - Macros - Stop Macro Recording - You can save the macro name as “Save & Make Project”
Preferences - Keymap - Macros

下移以展开宏目录以查找新宏(即“保存并制作项目”)。双击添加键盘快捷键,如果使用Mac则按Cmd + S,如果使用Windows,则按Ctrl + S.

Intellij会提示说已存在Ctrl + S,只需单击“替换”即可。

现在所有set和Ctrl + S都应该触发Spring-Boot Devtools

参考:https://tomyjaya.github.io/2016/10/08/spring-boot-dev-tools-in-intellij/


0
投票

在过去的几个月里我一直在MAC上面对这个问题。即使遵循此处列出的这些步骤,例如选中“自动生成项目”和“编译器自动执行”。

然而,在我的Job,我们使用Windows的地方,当我按照这些步骤操作时,它可以很好地工作。

我发现MAC上的这个问题的解决方案是添加一个新的运行配置(按^⌥R,然后按0)然后添加一个新的Maven配置。在“命令行”输入设置“spring-boot:run”。按“应用”和“确定”,然后选择创建的新配置运行项目。

当然你可以打开一个新的终端,只需输入“mvn spring-boot:run”它也可以。

© www.soinside.com 2019 - 2024. All rights reserved.