im_*_*chc 7 java intellij-idea hotswap dcevm intellij-14
我在使用Intellij IDEA社区版中的hotswap功能时遇到了麻烦.我的是第14.1.4节.
每次关闭调试并更改java代码后,我都已单击"重建项目",并在确认重新加载类时按"是".Intellij报告重新加载了更改的类,但应用程序结果与之前相同.我只是尝试最简单的Java应用程序(即不在像Tomcat,applet等场景中),其中的东西就像System.out.println是字符串连接等.我在调试模式下改变的只是方法体代码,而不是方法签名/名称.我无法得到它.
在Eclipse中我只是直接更改代码并按保存,然后它就可以了.
什么地方出了错?
(备注:
实际上我正在尝试使用DCEVM来实现结构更改(例如更改类名,方法名,添加方法等),认为它可以解决Intellij中发现的热插拔问题.不用说,它没有用.
在eclipse中,我成功使用了DCEVM,并且可以在调试期间更改方法名称.
我进一步尝试了hotswap-agent,它仍然没有用; 我发现一篇文章说IDE必须通过端口5000连接到JVM的JDPA,但不管我怎么试,Intellij控制台显示它仍然通过随机端口连接(51018下面):
"C:\Program Files\Java\jdk1.8.0_60\bin\java" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:51018...."
Run Code Online (Sandbox Code Playgroud)
连接到目标VM,地址:'127.0.0.1:51018',传输:'socket'
是否可以强制它通过一个特定的端口连接?DEBUG_OPT在运行/调试配置中添加环境变量不起作用)
在从Jetbrains发现一个针对问题请求的反馈之后发现它是Intellij的设计行为:
换句话说,问题与我如何测试hotswapping相关:
public class Main {
// /*
public static String getName() {
return "James"; // <=== (2)
}
//*/
public static void main(String[] args) {
System.out.println("Hello " + getName()); // <=== (1)
}
}
Run Code Online (Sandbox Code Playgroud)
因为Intellij的行为是"在VM退出过时的堆栈帧之前仍然使用旧代码"(与Eclipse相比有不同的行为),如果在(1)处将"Hello"更改为"Bye",则新代码将永远不会执行 - 新代码只有在第二次调用main()时才能再次执行,这是不可能的,因为应用程序已经终止
如果是(2)改变了(比如,用"Sean"代替"James")而不是(1),则在执行光标被放置在(1)处的断点停止的时间(因此避难所) t输入到getName()),然后重新加载该类,您将获得正在运行的新代码(打印"Sean")
DCEVM也完美地工作,使用相同的方式来测试hotswapping
您还可以在堆栈跟踪窗口中使用"drop frame"使当前语句回滚到方法的开头(main()除外) - 实际上它与Eclipse中的行为相同.
| 归档时间: |
|
| 查看次数: |
4452 次 |
| 最近记录: |