首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hotswap/DCEVM在Intellij IDEA (社区版)中不起作用

Hotswap/DCEVM在Intellij IDEA (社区版)中不起作用
EN

Stack Overflow用户
提问于 2015-09-10 17:09:15
回答 1查看 6.2K关注 0票数 9

在使用Intellij IDEA社区版的hotswap函数时,我遇到了麻烦。我的是14.1.4。

每次启动调试和更改java代码之后,我都已经单击“重新构建项目”,并在确认重新加载类时按“是”。将重新加载已更改的类的Intellij报告,但应用程序的结果与以前相同。我只是在尝试最简单的Java应用程序(例如,在Tomcat、applet等场景中),使用一些简单的东西,比如System.out.println、字符串连接等等。我在调试模式中更改的只是方法体代码,而不是方法签名/名称。我搞不懂。

在Eclipse中,我只需直接更改代码并按保存,然后它就能工作了。

哪里出了问题?

(备注:

实际上,我正在尝试使用DCEVM,它使结构更改成为可能(例如更改类名、方法名称、添加方法等),认为它可以解决Intellij中的hotswap问题。不用说,这不管用。

在eclipse中,我成功地使用了DCEVM,并且可以在调试期间更改方法名。

我进一步尝试了hotswap-agent,但它仍然没有工作;我遇到一篇文章说IDE必须通过JDPA-连接到JVM通过端口5000,但无论我如何尝试,Intellij控制台显示它仍然通过一个随机端口(下面51018)连接:

代码语言:javascript
复制
"C:\Program Files\Java\jdk1.8.0_60\bin\java" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:51018...."

连接到目标VM,地址:“127.0.0.1:51018”,传输:“套接字”

有可能强迫它通过一个特定的端口连接吗?在Run/Debug中添加DEBUG_OPT环境变量不起作用)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-13 12:18:10

在找到Jetbrains到发出请求的一个反馈后,发现这是Intellij的设计行为

换句话说,问题与我如何测试热交换有关:

代码语言:javascript
复制
public class Main {
//    /*
    public static String getName() {
        return "James"; // <=== (2)
    }

    //*/
    public static void main(String[] args) {
        System.out.println("Hello " + getName()); // <=== (1)
    }
}
  1. As Intellij的行为是,“在VM退出过时的堆栈框架之前,仍然使用旧代码”(与Eclipse不同的行为),如果您将"Hello“更改为"Bye”at (1),新代码将永远不会执行--只有在第二次调用main()时才能再次执行新代码,这是不可能的,因为应用程序已经终止。
  2. 如果更改的是(2) (例如,替换"James“w/ "Sean")而不是(1),则在执行游标被位于(1)处的断点停止时(因此尚未输入getName() ),然后重新加载类,您将得到正在运行的新代码(打印"Sean")。

DCEVM也非常有效,使用了相同的方法来测试热交换。

您还可以在堆栈跟踪窗口中使用"drop frame“使当前语句回滚到方法的开头(main()除外)--实际上它在Eclipse中的行为是相同的。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32507900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档