如何启用Intellij热代码替换功能

108

我的Intellij似乎在我的安装中没有进行基本的热代码替换。

针对以下代码:

public class MainTest {
    public void method1() {
        System.out.println("Breakpoint here");
    }

    public void method2() {
        System.out.println("Line that will get 24 modified");
    }

    public static void main(String[] args) {
        System.out.println("First print here");
        MainTest mainTest = new MainTest();
        mainTest.method1();
        mainTest.method2();
        System.out.println("Line that I do not modify");
    }
}

我在mainTest.method1();处设置了断点,然后修改了method2()中的字符串,按下ctrl+s并逐步执行。不幸的是,运行时没有更新,旧字符串仍然被打印出来。只有编译-运行才会打印新字符串。因此我的结论是热交换不起作用。

是否需要设置任何设置以启用热代码交换?

  • Ubuntu,JDK 1.6
  • Intellij 10.5 Ultimate(评估版)

我从未听说过命令行应用程序的热插拔,只有Web应用程序才有。 - duffymo
21
作为从 Eclipse 转过来的人,我希望 IntelliJ 也能做到这一点。我是不是漏掉了什么? - Maxim Veksler
我也遇到了很多问题,后来我知道了如果你使用虚拟机,热交换就不会起作用。 - Ashish Shetkar
IDEA 2021.2:设置 -> 高级设置 -> 允许自动构建即使正在运行开发应用程序。添加依赖项:spring-boot-devtools - Nick Dong
在IntelliJ中,您必须处于“调试模式”才能使热交换起作用。 - Mehraj Malik
8个回答

144

在等待断点时保存您的类后,只需使用 Build -> Compile 'MainTest.java' 进行重新编译,或按下标准键绑定中的 Ctrl+Shift+F9

然后,IntelliJ IDEA将显示一个小对话框,询问您是否要重新加载该类。


7
好的,谢谢。我能让IntelliJ自动编译吗?(更好的功能是允许:保存而不进行自动编译,然后默认打开按需编译)。 - Maxim Veksler
4
请查看 http://www.jetbrains.com/idea/webhelp/reloading-classes.html 和 http://www.jetbrains.com/idea/webhelp/debugger-hotswap.html。 - joschi
2
非常感谢,我花了很多时间寻找这个! - Simcha
仅适用于Mac版本,需要执行Build -> Recompile 'MainTest.java',稍有不同。 - Deoxyseia
真正帮助我的是 Save Actions 插件 https://plugins.jetbrains.com/plugin/7642-save-actions。 - Tamilselvan
显示剩余2条评论

34

在进行以下修改并启用热交换之后,Java文件的更改需要1-2秒的重启时间(对我来说初始启动时间约为7秒)。

希望下面的方法有所帮助...


首先,您需要在首选项菜单中勾选“自动构建项目”选项。

打开首选项菜单的方法如下:

您可以转到顶部菜单并单击:

IntelliJ IDEA -> Preferences

或者您可以通过键盘输入以下快捷方式:

cmd + option + s

然后,在如下图片中勾选 Make project automatically 选项;

enter image description here

其次,您需要将 compiler.automake.allow.when.app.running 注册表设置改为 true。

要打开注册表,您需要单击以下键盘快捷键:

cmd + shift + a

按照下面的图片输入 registry ,选择 Registry,并按键盘上的回车键;

enter image description here

打开 Registry 窗口后,输入 compiler.automake 来查看 compiler.automake.allow.when.app.running 选项,并勾选它,如下图所示;

enter image description here

然后,您需要重新启动 IntelliJ 以使注册表更改生效。


2
当我调试应用程序并构建项目或仅编译文件时,HotSwap对我有效。但是,即使完成了上面的注册表设置,它在保存时也不起作用。这是因为我处于Debug而不是Run模式吗? - Dima Korobskiy
4
在IntelliJ中,要使用热替换功能,必须处于调试模式下。 - Woodchuck

9
在Intellij 11中有一个名为“调试器 > 热部署”的选项。

3
有一个名为“Eclipse Mode”的插件,其功能与 Eclipse 的后台增量编译完全相同。 - Pratik Khadloya
2
好的评论,可惜这个插件似乎不再维护了 http://plugins.intellij.net/plugin/?id=3822 - Maxim Veksler
3
在Intellij 13中使用:文件->设置->(在搜索栏中输入“HotSwap”)。 - Ghandhikus

9

进入“设置”--> 选择“调试”--> 热交换

enter image description here


3
即使使用这个功能,我仍然需要手动指示IntelliJ重新编译。但这确实让它变得更容易了,因为你不必回答是否要重载类的问题。 - Henno Vermeulen

8
我想您在询问这个问题:
  1. 右键单击您的Java类
  2. 选择编译并重新加载文件

6

我希望每次保存Java文件时都自动运行hotswap。其他答案都没有实现这个功能,所以我:

  1. 创建了一个在保存时运行的宏:https://dev59.com/QHNA5IYBdhLWcg3wdtz5#5581992
  2. 在宏的结尾添加了Action: HotswapRun -> Reload Changed Classes

3

0

我在Ubuntu上遇到了这个问题。我还遇到了一个貌似无关的问题,即IntelliJ报告文件监视限制错误(很抱歉我不再记得确切的错误消息)。为了解决后来的问题,我采取了以下步骤:

  1. 将以下行添加到/etc/sysctl.conf文件或/etc/sysctl.d/目录下的新的*.conf文件(例如idea.conf)中:

    fs.inotify.max_user_watches = 524288
    
  2. 然后运行以下命令应用更改:

    sudo sysctl -p --system

现在我的React组件可以很好地重建和热交换。

源代码


我有类似的问题,但是这个(增加文件监视器)对我没有帮助。 - Rejeev Divakaran

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