IntelliJ 15,SpringBoot devtools livereload 不工作

Posted

技术标签:

【中文标题】IntelliJ 15,SpringBoot devtools livereload 不工作【英文标题】:IntelliJ 15, SpringBoot devtools livereload not working 【发布时间】:2016-02-25 11:23:18 【问题描述】:

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

【问题讨论】:

答案要点:此功能会在 target/ 文件夹中的 .class 文件更改时重新启动服务器,而不是在您仅更改源 .java 文件时重新启动服务器。当您保存更改的源代码文件时,有一种方法可以强制 intellij 更新类路径上的 .class 文件。但是,此功能旨在与自动执行此操作的 eclipse ide 一起使用。 对我来说,我在 STS 中更新 [检查自动构建] 转到 windows -> 首选项 -> 构建 我发现了一个奇怪的变化;使用 Firefox 版本的插件,livereload 对某些页面来说就像一个魅力,但对其他页面则不然。切换到 Chrome,它适用于所有页面。可能是 Firefox 扩展中的错误? 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

see on youtube

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

    您需要启用“自动生成项目”选项。你可以 在设置 - 构建、执行、部署 - 编译器中找到它 要打开注册表,按 Ctrl-Alt-Shift-/ 并从出现的菜单中选择“注册表”,启用“compiler.automake.allow.when.app.running” 复选框。

【讨论】:

【参考方案3】:

我猜您正在编码并期望 DevTools 自动神奇地发现您在项目中更改了某些内容? Devtools 通过观察你的类路径文件夹来做到这一点。当 .class 文件(或资源)发生更改时,devtools 会采取适当的措施。

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

【讨论】:

试图理解以下“Intellij 用户将需要移除器才能使用 Build → Make Project 操作来获得相同的结果。”也许这是说“记住”而不是“卸妆”?你们是否设置了宏或其他东西来自动制作您的项目? IntelliJ 仅在应用程序未运行时才支持此功能...我看到其他人需要创建宏并将其绑定到“CTRL+S”操作。 got fixed on master already 是一个错字。 Make Project 只是一种捷径。如果您觉得“CTRL-S”更适合您,请执行此操作。但它本质上是完全一样的。我真的不买“自动制作”的方法,但那可能只是我自己。 好的,但是静态资产呢。为什么我需要为他们调用 Build? @Kaspar - 谢谢你提出这个问题。我必须手动调用构建才能查看静态 html 文件的更改。对我来说,这不是一个很好的工作流程。 我同意。在这个问题中:***.com/questions/34104664/… 我提到当我将静态资产移出资源文件夹时,问题实际上已得到解决。你也可以试试。【参考方案4】:

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

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

build\classes\main

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

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

bootRun 
    addResources = true

【讨论】:

此时 bootRun 配置已更改为 sourceResources sourceSets.main:docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/…【参考方案5】:

在 IntelliJ 2021.2 compiler.automake.allow.when.app.running 选项消失。此选项已移至高级设置:

【讨论】:

这解决了我的问题【参考方案6】:

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

    Ctrl+Shift+A 搜索注册表... 滚动并找到“compiler.automake.allow.when.app.running”,然后选中复选框以使其处于活动状态。 点击关闭 文件菜单 -> 设置 ... 扩展构建、执行、部署 选择编译器 选中复选框自动构建项目 申请 点击确定

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

快乐的编码/黑客。

【讨论】:

【参考方案7】:

实时重新加载是与您要求解决方案的问题不同的功能。 在您的情况下,如果您想在更改类后重新加载类,则需要遵循以下 3 个步骤-

    更改编译器设置 在注册表中进行更改 在运行/调试配置中进行更改

就是这样! 修改类后,您只需按 ctrl+F10 即可重新加载修改后的类。那你可以走了!

另外,如果你想在修改时配置单点重载:https://www.logicbig.com/tutorials/spring-framework/spring-boot/trigger-file.html


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

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 文件进行任何更改时,您只需刷新浏览器即可查看更改!

【讨论】:

【参考方案8】:

来自文档here

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

【讨论】:

【参考方案9】:

要回答上述问题,让我们首先了解 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。 我希望这个解释和解决方法有所帮助。

【讨论】:

【参考方案10】:
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/

【讨论】:

【参考方案11】:

intellij 2021.2 已将此选项移至 AdvancedSettings:

【讨论】:

这是最新版 IntelliJ 的正确答案。这是唯一对我有用的解决方案。谢谢@Leonardo Moura【参考方案12】:

我发现 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

【讨论】:

我只是使用小“绿色锤子”构建所有按钮来触发重启。适合我。【参考方案13】:

IntelliJ IDEA 2021.2 中,compiler.automake.allow.when.app.running 选项消失了。

所以按照这些步骤,

    文件⇒设置⇒构建、执行、部署⇒编译器⇒自动构建项目 高级设置⇒ 即使开发的应用程序当前正在运行,也允许自动启动 将此行添加到 application.properties 文件⇒ spring.devtools.restart.enabled=true

【讨论】:

【参考方案14】:

应用以下步骤:

    在您的浏览器中添加 LiveReload 扩展。 链接: https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei

    将 devtools 依赖项添加到您的 pom.xml(对于 maven)或 build.gradle(对于 gradle)

对于 Maven:

     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
     </dependency>

毕业典礼

     compileOnly("org.springframework.boot:spring-boot-devtools")

    文件->设置->构建、执行、部署。转到->编译器->自动构建项目。

    Ctrl+Shift+A ->registry-> compiler.automake.allow.when.app.running

    Ctrl+Shift+A ->编辑配置->Spring Boot->你的应用程序->

【讨论】:

【参考方案15】:

我正在使用 IntelliJ IDEA 2021.2.2(终极版)。

我遵循了这些步骤,

File -> Settings -> Build, Execution, Deployment-> Compiler add tick to Build project automatically 复选框

接下来, 按Ctrl+Shift+A 搜索注册表... 滚动并找到“compiler.automake.allow.when.app.running”然后我找不到。

然后我研究发现在 IntelliJ 2021.2 compiler.automake.allow.when.app.running 选项消失了。此选项已移至高级设置:

高级设置

【讨论】:

【参考方案16】:

1- 将 Spring Boot devtools 依赖项添加到您的 maven pom.xml 文件中。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <version>your-desired-version</version>
</dependency>

2- 重启项目。

3- 更改除方法签名、参数或类似内容之外的一些 java 代码。例如,更改简单的代码行或更改字符串文字。

4- 不用重启项目,而是使用 Ctrt+shift+f9.

5- 在浏览器上享受结果。

【讨论】:

谢谢你:)。这种解决方法适用于 intellij。我知道这个功能是为 eclipse 而不是 intellij 的。【参考方案17】:

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

但是在我使用 Windows 的工作中,当我按照这些步骤操作时,它可以完美运行。

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

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

【讨论】:

【参考方案18】:

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

    spring.devtools.restart.enabled=true

【讨论】:

【参考方案19】:

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

【讨论】:

【参考方案20】:

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

【讨论】:

【参考方案21】:

文件->设置->构建、执行、部署->编译器 为Build project automatically复选框添加勾选

Ctrl+ Shift+alt++ -> 选择注册表 给compiler.automate.allow.when.app.running添加打勾

【讨论】:

【参考方案22】:

IntelliJ IDEA > 首选项 > 工具 > 高级设置 > 编译器 > 选中该框以允许自动制作启动,即使开发的应用程序当前正在运行。

在相应的 pom.xml 上添加以下依赖项。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

在服务器运行时进行您想要进行的更改。

构建 > 构建项目

重新加载浏览器

【讨论】:

【参考方案23】:

如果它是 Maven 并且您想要开发工具,那么检查您的 pom.xml 中的依赖项是否已由 Intelli J 正确导入。 就我而言,它显示为红色,因此我进行了 Maven 刷新,并在遵循其他 cmets 的其他 Registry 建议后解决了我的问题。

【讨论】:

以上是关于IntelliJ 15,SpringBoot devtools livereload 不工作的主要内容,如果未能解决你的问题,请参考以下文章

IntelliJ 社区版中的 Spring Boot 项目

当 spring-boot 运行时 IntelliJ 进程以退出代码 0 完成

Eclipse & Intellij DE - 无法连接到 mysql 数据库

使用 Groovy、IntelliJ 和 Gradle 在项目中“重新运行 Spring Boot 配置注释处理器”

禁用 IntelliJ CPU 分析器

Intellij 运行相同的 Spring Boot 项目,社区版运行良好,但终极版抛出错误