gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:22:28 27 4
gpt4 key购买 nike

我在使用 Intellij IDEA Community Version 的 hotswap 功能时遇到了麻烦。我的是 v 14.1.4。

每次我启动调试并更改 java 代码后,我已经单击重建项目并在确认重新加载类时按"is"。 Intellij 报告已重新加载更改的类,但应用程序结果与以前相同。我只是在尝试最简单的 Java 应用程序(即不在 Tomcat、applet 等场景中),其中包含 System.out.println、字符串连接等内容。我在 Debug模式下所做的更改是只是方法体代码,而不是方法签名/名称。我无法得到它。

在 Eclipse 中,我直接更改代码并按保存,然后就可以了。

出了什么问题?

(备注:

事实上,我正在尝试使用 DCEVM,它使结构更改成为可能(例如更改类名、方法名、添加方法等),认为它可以解决 Intellij 中发现的热插拔问题。不用说,它没有用。

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

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

"C:\Program Files\Java\jdk1.8.0_60\bin\java" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:51018...."

连接到目标虚拟机,地址:'127.0.0.1:51018',传输:'socket'

是否可以强制它通过一个特定端口连接?在运行/调试配置中添加 DEBUG_OPT 环境变量不起作用)

最佳答案

在找到 Jetbrains 对 issue request 的反馈后发现这是 Intellij 的设计行为:

Feedback of an issue request from Jetbrains

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

public class Main {
// /*
public static String getName() {
return "James"; // <=== (2)
}

//*/
public static void main(String[] args) {
System.out.println("Hello " + getName()); // <=== (1)
}
}
  1. 由于 Intellij 的行为是“在 VM 退出过时的堆栈框架之前仍然使用旧代码”(与 Eclipse 相比不同的行为),如果您将“Hello”更改为(1) 处的“再见”,新代码永远不会执行——只有当第二次调用 main() 时,新代码才能再次执行,这是不可能的,因为应用程序已经终止

  2. 如果是 (2) 被更改(例如,将“James”替换为“Sean”)而不是 (1),在执行游标被断点停止期间放置在 (1)(因此还没有进入 getName()),并且您重新加载该类,您将获得正在运行的新代码(打印“Sean”)

DCEVM 也能完美运行,使用相同的方式测试热插拔

您还可以在堆栈跟踪窗口中使用“drop frame”使当前语句回滚到方法的开头(main() 除外)——事实上,这与 Eclipse 中的行为相同。

关于java - Hotswap/DCEVM 在 Intellij IDEA(社区版)中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32507900/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com