【问题标题】:Hot to HotSwap code in Intellij in a Spring-Boot project?在 Spring-Boot 项目中对 Intellij 中的 HotSwap 代码很热?
【发布时间】:2019-06-30 13:12:55
【问题描述】:

我将spring-boot-starter 用于一个较大的服务器项目,该项目打开一个静态套接字进行通信。由于每次代码更改后不必总是在Intellij IDEA 中重新启动服务器(从而退出套接字连接),我正在尝试 HotSwap 更改的 *.java 代码。

我尝试如下没有成功:

  • 添加了maven spring-boot-devtools 依赖
  • 设置>Build project automatically [yes]
  • 注册表:complier.automake.allow.when.app.running [true]
  • 运行配置 > 更新策略:Update classes and resources

但是:每当我修改一个类时,我的应用程序都会自动重新启动。当然这也会重新加载类,但是我也可以自己随意触发重启。我没有通过自动重启获得任何东西。

所以我通过spring.devtools.restart.enabled=false 禁用了重启。但是在服务器重新启动之前,代码交换不起作用。

但是如果没有明确的重新启动,是否有可能?

旁注:我不是要在浏览器中热交换 Web 用户界面。我只想重新加载java代码。

【问题讨论】:

  • 您是否使用 Gradle 任务来运行应用程序?如果你想使用 IDE 热插拔,你应该使用 IDE 运行/调试配置来启动应用程序。
  • 如果您更改应用程序的任何结构部分,热插拔将不起作用。如果您更改参数的类型、方法的名称、返回的类型、创建新的方法/类/等等……您将无法做到。如果您在方法中更改某些内容,只有它所在的类会重新编译,您不需要重新启动应用程序,所以我想它会按照您的意愿工作。但是对于任何“大”的变化它都不起作用

标签: java spring spring-boot intellij-idea hotswap


【解决方案1】:

这就是 Spring Boot 开发工具的工作方式,每次更改都需要重新启动,但使用开发工具重新启动要快得多,因为它使用自定义类加载器:

Spring Boot 提供的重启技术通过使用两个 类加载器。不变的类(例如,那些来自 第三方 jars)被加载到基类加载器中。你上的课 正在积极开发被加载到重新启动类加载器中。什么时候 应用程序重新启动,重新启动类加载器被丢弃 并创建了一个新的。这种方法意味着应用 重新启动通常比“冷启动”快得多,因为基础 类加载器已经可用并已填充。

如果您想在不重新启动的情况下热交换代码,那么一种选择是使用JRebel。 Spring Boot 文档声明相同:

如果您发现重新启动对您的应用程序来说不够快 或者你遇到类加载问题,你可以考虑重新加载 ZeroTurnaround 的 JRebel 等技术。

【讨论】:

  • 好吧,我误解了这个功能。由于 JRebel 不提供社区版,我可能在这里不走运......
  • 但是有什么选项 build->On Update action->Hot swap classes and update trigger if failed in last IDEa?
猜你喜欢
  • 1970-01-01
  • 2020-01-23
  • 2016-11-30
  • 1970-01-01
  • 2018-04-04
  • 2017-12-22
  • 2020-01-14
  • 2017-01-04
  • 1970-01-01
相关资源
最近更新 更多