使用Intellij IDE实现Spring Boot热交换

93

我有一个使用Intellij IDE运行正常的Spring Boot应用程序。即我启动了具有main方法并委托给SpringApplication.run的Application类。一切都很好,除了热部署。当我改变源代码时,我被迫重新启动应用程序。即使我在调试模式下启动应用程序,我也看不到热部署工作。我可以看到Intellij的调试设置启用了热部署。

我的观察表明,当我运行Spring Boot应用程序时,所使用的类路径是:

/projects/MyProject/classes/production/....

当我更改代码时,classes/production目录下的文件没有得到更新。Intellij IDE编译文件,但不会更新classes/production目录。我如何在IntelliJ IDE中为Spring Boot启用热部署?


请查看此链接:https://dev59.com/SWEi5IYBdhLWcg3wUK6C#43114954 - shabby
10个回答

120

使用 devTools 的解决方案有效:

1 - 将 devtools 添加到您的项目中

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

2 - 启用自动构建

打开 设置 --> 构建-执行-部署 --> 编译器,并启用以下选项:

Build Project Automatically.

3 - 更新 compiler.automake.allow.when.app.running 的值

按下 ctrl+shift+A 并搜索 registry。在注册表中启用:

compiler.automake.allow.when.app.running

参考文献:


8
这是否只是重新启动SpringBoot,就像您手动执行时那样?在重新启动期间需要相同的时间吗? - powder366
4
每当更改任何文件时,“compiler.automake.allow.when.app.running”都会重新启动。 这需要太长时间。 - Gank
2
应用程序只有在我关闭文件并重新启动所有Spring Boot时才会重新启动,这不是真正的热重载... 我错过了什么吗?我正在使用Idea Ultimate。 - Johnny Willer
12
2021年2月,步骤3更改为启用设置-->高级设置-->允许在正在运行开发应用程序的情况下启动自动制作 - maechler
1
对于 macOS 用户的一条有用提示。如果 cmd+shift+a 不起作用,您可以尝试使用 shift+shift,这应该会打开对话框,然后您可以搜索 Registry。 - anuraagdjain
显示剩余9条评论

45

找到了根本原因。这与Spring-boot无关。当我更改我的Groovy源文件时,文件没有自动编译。

重新编译更改的文件并交换它们:

  • Windows上使用Ctrl+Shift+F9
  • Mac上使用Cmd + Shift + F9

如何禁用在每次更改一个文件时重启项目。 - Gank
您可以使用触发文件。请参见:https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-boot-devtools-restart-triggerfile - Lee Marlow
1
对于持怀疑态度的人,键位图将此快捷键列为“编译所选文件、包或模块”。 - Brad Turek
1
在所有这些不起作用的答案中,这是唯一有用的! - Zony Zhao

30

步骤1:添加开发人员工具依赖

Maven。

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

Gradle。

dependencies {
    compile("org.springframework.boot:spring-boot-devtools")
}

步骤2: 转到 文件 | 设置 | 构建、执行、部署 | 编译器

启用自动构建项目 & 应用 & 确定

在此输入图片描述

步骤3: 按下快捷键 Ctrl+Shift+A & 搜索 Registry 关键字并按 Enter

在此输入图片描述

启用complier.automake.allow.when.app.running & 单击关闭按钮

在此输入图片描述

步骤4: 在您喜欢的 Web 浏览器上禁用缓存

在此输入图片描述

步骤5: 完成!!!

在 YouTube 上查看解决方案

解决方案


如果在 Mac 版本中,您在第二次输入“Registry”后,操作窗口立即关闭,您可以按两次“Shift”按钮以再次弹出操作窗口。 - Yao Li
感谢您使用@shellhub。 - Pasha
3
此外,在2021.2版本之后,编译器的automake.allow.when.app.running选项已移至高级设置中。偏好设置 -> 高级设置 -> 编译器 -> 允许Automake......等等。 - iceberg
在2021.3.3 CE中找不到此内容。 - RBz
https://youtrack.jetbrains.com/issue/IDEA-274903/In-IntelliJ-2021.2-compiler.automake.allow.when.app.running-disappear.-Unable-to-enable-live-reload-under-Spring-boot - Razkar

15

尽管我添加了Spring Boot开发工具并勾选了自动构建项目,但在我的情况下它仍然无法正常工作。缺失的是:

  1. 进入项目运行配置。

  2. 将“更新”操作和“在框架失活时”都设置为“更新类和资源”。这样就会像魔术般地运行。

enter image description here


3
这就是我为什么写了一条评论的原因:当我点击运行 -> 编辑配置时,我没有看到任何有关'更新'操作或帧停用选项的信息。(我使用的是Intellij 2018.1.6版本) - RichArt
你能否在点击“编辑配置”时发送一张截图或链接?这样可以更容易地看到发生了什么。 - Sameer Khanal
3
@RichArt 我遇到了同样的问题。不幸的是,所提到的运行配置是针对Intellij Spring Boot支持的 - 仅在Ultimate版本中可用。 - Laurence
@BinaryMonkL:我正在开发终极版。我还漏掉了什么吗? - RichArt
@RichArt,您需要将其配置为Spring应用程序,并从左侧选项卡中选择Spring Boot运行配置。 - Laurence
显示剩余3条评论

9

使用spring-loaded。它可以很好地与bean重新加载一起使用,并且是JRebel的免费替代品。

另一种方法是使用DCEVMhotswapagent


除了Mybatis的mapper.xml文件之外,一切都很完美。在更改了myapper.xml文件中的SQL代码后,重新加载无法正常工作。 - Gank

5
我也遇到了同样的问题。我使用的是Intellij 13.1.1版本,为了热替换更改后的类,我必须在调试模式下运行应用程序,然后在更改类之后手动选择“Run-> Reload Changed Classes”。
我还将调试器设置为热交换,如http://www.jetbrains.com/idea/webhelp/reloading-classes.html中所示,但似乎不起作用。
无论如何,至少手动“Run-> Reload Changed Classes”菜单可以使用。

4

仅适用于旗舰版。 - RBz

2

如果需要多个更改,请使用“编译并重新加载文件”(首先添加“spring-boot-devtools”)。在 Mac 上双击“Shift”以显示图表。

或者尝试spring-loaded,我还没有尝试过。但似乎可以工作。 enter image description here


0
在部署选项卡中添加已解压的部署构件,这对我很有帮助。

-1

您可以使用以下任一方法来自动重新加载Thymeleaf模板:

  1. Spring Boot Dev Tools
  2. 更改Thymeleaf模板路径
  3. Gulp Watch

我推荐使用Gulp watch,因为它更容易设置并且效果很好:

var gulp = require('gulp'), 
watch = require('gulp-watch');

gulp.task('watch', function () {
    return watch('src/main/resources/**/*.*', () => {
            gulp.src('src/main/resources/**')
                //replace with build/resources/main/ for netBeans
                .pipe(gulp.dest('out/production/resources/')); 
    });
});

gulp.task('default', ['watch']);

现在在您的终端中输入以下命令以启动 gulp watch:

$ gulp 
//OR
$ gulp watch

我写了一篇关于在IntelliJ IDE中无需重启自动重新加载Thymeleaf模板的博客文章(自动重新加载Thymeleaf模板而无需在IntelliJ IDE中重新启动)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接