Java Spring启动项目中Intellij中的热插拔代码?

Java Spring启动项目中Intellij中的热插拔代码?,java,spring,spring-boot,intellij-idea,hotswap,Java,Spring,Spring Boot,Intellij Idea,Hotswap,我正在为一个更大的服务器项目使用springbootstarter,该项目打开一个静态套接字进行通信。为了避免每次代码更改后都必须在intellijidea中重新启动服务器(从而退出套接字连接),我尝试HotSwap更改的*.java代码 我做了如下尝试,但没有成功: 添加了mavenspring引导devtools依赖项 设置>自动生成项目[是] 注册表:complier.automake.allow.when.app.running[true] 运行配置>更新策略:更新类和资源 但是:每

我正在为一个更大的服务器项目使用
springbootstarter
,该项目打开一个静态套接字进行通信。为了避免每次代码更改后都必须在
intellijidea
中重新启动服务器(从而退出套接字连接),我尝试HotSwap更改的*.java代码

我做了如下尝试,但没有成功:

  • 添加了maven
    spring引导devtools
    依赖项
  • 设置>
    自动生成项目[是]
  • 注册表:
    complier.automake.allow.when.app.running[true]
  • 运行配置>更新策略:
    更新类和资源
但是:每当我修改一个类时,我的应用程序就会自动重新启动。当然,这也会重新加载类,但是我也可以随意触发重启。自动重启不会给我带来任何好处

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

但是,如果没有显式重启,这有可能吗


旁注:我不想在浏览器中热交换web UI。我只想重新加载java代码。

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

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

如果您想在不重新启动的情况下热交换代码,那么一个选项是使用。Spring引导文档说明了相同的情况:

如果发现应用程序的重启速度不够快 或者遇到类装载问题时,可以考虑重新加载。 ZeroTurnound的JRebel等技术


您是否使用Gradle任务来运行应用程序?如果要使用IDE热插拔,应使用IDE运行/调试配置启动应用程序。如果更改应用程序的任何结构部分,热插拔将不起作用。如果更改参数的类型、方法的名称及其返回的类型,则创建一个新的方法/类等。。。你将无法做到这一点。如果你在一个方法中改变了一些东西,只有它所在的类会重新编译,你不需要重新启动应用程序,所以我想它会像你想的那样工作。但是对于任何“大”的改变,它都不能正常工作,所以我误解了这个特性。由于JRebel不提供社区版,我可能在这里运气不好。。。