IntelliJ 15,SpringBoot devtools livereload不起作用


70

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";
    }
}

1
答案的主要内容:当目标/文件夹中的.class文件更改时,而不是仅更改源.java文件时,此功能将重新启动服务器。保存更改后的源代码文件时,有一种方法可以强制intellij更新类路径上的.class文件。但是,此功能旨在与自动执行此操作的eclipse ide一起使用。
masterxilo

对我来说,我在STS中更新了[检查是否自动构建],请转到
Windows-

Answers:


51

我猜您正在编码,并且期望DevTools自动神奇地发现您已更改了项目中的某些内容?Devtools通过查看您的classpath文件夹来做到这一点。当一个.class文件(或资源)已经改变,devtools采取了恰当的行动。

如果您什么都没看到,那可能是因为您只是在编码而不更新类路径。您必须调用Make Project来更新类路径。请参阅 说明文件


1
尝试理解以下内容:“ Intellij用户将需要卸妆才能使用Build→Make Project操作来获得相同的结果。” 也许这是说“记住”而不是“删除”?你们设置宏或自动创建项目的方法了吗?IntelliJ仅在应用程序未运行时才支持此功能。我已经看到其他人需要创建宏并将其绑定到“ CTRL + S”操作。
Timm-ah

这是错字,已经掌握了。Make Project只是一个快捷方式。如果您认为“ CTRL-S”更适合您,请执行此操作。但这本质上是完全一样的。我真的不购买“自动创建”方法,但是可能就是我。
Stephane Nicoll 2015年

8
好的,但是静态资产呢。为什么我需要为他们调用Build?
卡斯珀2015年

4
@Kaspar-感谢您提出这个问题。我必须手动调用一个版本才能查看对静态html文件的更改。对我来说,这不是一个很好的工作流程。
arcseldon '16

我同意。在这个问题中:stackoverflow.com/questions/34104664/… 我提到当我将静态资产移出资源文件夹时,该问题实际上已得到解决。您也可以尝试。
卡斯珀(Kaspar)

55

要解决此问题,您可以执行以下操作:

  1. 在浏览器中添加LiveReload扩展。
  2. 将devtools依赖项添加到pom.xml(如果是maven(spring-boot-devtools))。
  3. 在您的intellij IDEA中,转到:文件->设置->构建,执行,部署。转到->编译器->自动构建项目。
  4. 在您的IntelliJ IDEA中:SHIFT + Ctrl + A- >注册表->编译器.automake.allow.when.app.running

54

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

在YouTube上看到

最简单的解决方案:运行应用程序调试模式,然后按 Ctrl + f9(构建快捷方式)

要么

  1. 您需要启用“自动创建项目”选项。您可以在“设置” –“构建,执行,部署–编译器”中找到它
  2. 要打开注册表,请按Ctrl-Alt-Shift- /组合键,然后从出现的菜单中选择“注册表”,启用“ compiler.automake.allow.when.app.running”复选框。

自动构建项目

应用运行时编译器允许自动编译


16

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

您的问题描述了重新启动方案。如果希望您的应用程序在* .class-files更改时自动重新加载,请确保您的IDE输出将编译的类输出到:

build\classes\main

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

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

bootRun {
    addResources = true
}

2
这bootRun配置已更改为sourceResources sourceSets.main在此期间:docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/...
亚历山大阿布拉莫夫

9

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

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

现在,停止您的应用程序服务器,然后启动您的应用程序,就是这样,当在项目中检测到任何更改时,您将发现自动重启/重新加载已激活。

快乐编码/黑客。


6

这里的文档

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


4

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


3

实时重新加载是与您要求解决方案的问题不同的功能。在您要更改它们后重新加载类的情况下,您需要执行以下3个步骤:

  1. 更改编译器设置 在此处输入图片说明
  2. 在注册表中进行更改 在此处输入图片说明
  3. 在运行/调试配置中进行更改 在此处输入图片说明

而已!修改类后,只需按ctrl + F10重新加载修改后的类。那你很好去!

另外,如果要在修改后配置单点重新加载,请访问:https ://www.logicbig.com/tutorials/spring-framework/spring-boot/trigger-file.html


对于实时重载: 在Intellij IDEA中运行Spring Boot应用程序时,将从out / production / resources / templates目录提供模板。您可以更改此行为,并在开发模式下直接从src / main / resources / templates目录提供模板。在src / main / resources目录中创建一个文件application-dev.yml,并将以下代码片段粘贴到其中:

spring:
    # Templates reloading during development
    thymeleaf:
        prefix: file:src/main/resources/templates/
        cache: false

    # Static resources reloading during development
    resources:
      static-locations: file:src/main/resources/static/
      cache-period: 0

要加载以上属性,您需要激活并将默认的Spring Boot配置文件设置为dev。将以下属性添加到application.yml文件:

spring:
    profiles:
      active: dev

启动您的应用程序。现在,只要您在html文件中进行任何更改,您所需要做的就是刷新浏览器以查看更改!


2
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已经存在,只需单击“替换”。

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

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


1

我发现IntelliJ甚至没有使用我的Gradle配置。

参观Build, Execution, Deployment > Build Tools > Gradle然后在Delegate Settings我选择Build and Run Using,并使它Gradle

像魅力一样工作

在此处输入图片说明

供参考,这是我的构建配置:

plugins {
    id 'org.springframework.boot' version '2.1.6.RELEASE'
    id 'java'
    id 'idea'
}

apply plugin: 'io.spring.dependency-management'

group = 'test'
version = '0.0.1'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
}

这可以很好地代替

bootRun {
    addResources = true // Did not work for me
}

1
我只是使用“绿色锤子”内置的小按钮来触发重新启动。适合我。
sparkyspider19年

0

在上个月的MAC上,我经常遇到这个问题。即使遵循此处列出的这些步骤,例如检查“自动创建项目”和“编译器自动制作”。

但是,在我使用Windows的Job上,当我按照以下步骤操作时,它可以完美工作。

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

当然,您可以打开一个新终端,然后键入“ mvn spring-boot:run”,它也将起作用。



0

如果LiveReload过去为您服务,然后突然停止工作,并且其他建议的解决方案不起作用,请尝试卸载并重新安装LiveReload Browser插件。这就是最终为我解决的问题。


0

完成上述所有设置后,您应该重新编译要重新加载的html文件!
生成→重新编译'yourHtmlFile.html'(在Windows中为Ctrl + Shift + F9)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.