关于IDEA中build的作用及其与 热部署&debug断点消失的关系

转自:https://blog.csdn.net/qq_42168543/article/details/113677654?ops_request_misc=&request_id=&biz_id=102&utm_term=idea%E4%B8%ADdebug%E8%BF%90%E8%A1%8C%E6%97%B6%E5%8A%A0%E4%B8%8A%E6%96%AD%E7%82%B9%E5%90%AF%E5%8A%A8%E5%90%8E%E6%96%AD%E7%82%B9%E6%B6%88%E5%A4%B1&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-2-113677654.pc_search_all_es&spm=1018.2226.3001.4187
 
 

众所周知,使用热部署可以避免每次后台代码改动都要重启IDEA,大大提高了开发效率。通常使用devtools等第三方jar包进行热部署,能不能不通过devtools实现热部署呢 最近发现IDEA的build居然有类似于热部署的功能(用了这么久的IDEA 居然不知道这个 QAQ 有点捞)

相信在使用IDEA的时候 很多人都遇到过打不上断点的情况,原因就是部署到服务器上的代码中该行无法被debug

e.g. 项目启动时:

关于IDEA中build的作用及其与 热部署&debug断点消失的关系

以上,springboot项目启动后,打了三个断点, 位于14 15 18 行 ,其中18行没有可执行的代码所以断点被禁用 呈灰色
此时 服务器中运行的代码和本地代码是完全一致的

之后按回车键 让代码下移两行
关于IDEA中build的作用及其与 热部署&debug断点消失的关系

可以看到原先的15行被挤到了17行,由于服务器中17行是空白行,所以此时断点会失效

继续下移一行 :
关于IDEA中build的作用及其与 热部署&debug断点消失的关系
此时 String a = "a"String b = "b"的断点全部失效 因为服务器上的17 18两行都是无法打断点的

回到第一张图,我们在第一张图中加上两句:
关于IDEA中build的作用及其与 热部署&debug断点消失的关系
还是由于上述原因,这两行的断点是消失的,因为它们没有被加载服务器中,即服务器中的版本里17 18行是无法被debug的。

解决方法:
build > build project 此时debug按钮又生效了:
关于IDEA中build的作用及其与 热部署&debug断点消失的关系
显然build可以将本地的最新内容更新进服务器 ,从而实现类似热部署的功能(无需重启项目)

此时我么可以毫无影响对新增代码进行debug :

关于IDEA中build的作用及其与 热部署&debug断点消失的关系

然而要注意,以上方法局限于对类中方法的改动,如果是类的结构进行改动,这些改动无法通过build被更新进服务器 :

关于IDEA中build的作用及其与 热部署&debug断点消失的关系
build之后它们的断点还是无法生效 显然build无法加载类级别的改动:
关于IDEA中build的作用及其与 热部署&debug断点消失的关系

关于IDEA中build的作用及其与 热部署&debug断点消失的关系

文章到此可结束了 以下是我处于对debug的好奇 做了几个测试

从上文可以知道 保证本地代码和服务器端同步似乎是debug的内在要求(这是合乎情理的 如果二者不同步还调试个卵子)

1. 如果本地代码变动了 但是断点没失效会怎么样呢:
e.g. 刚开始的状态(同步状态)
关于IDEA中build的作用及其与 热部署&debug断点消失的关系
让代码下移一行:
关于IDEA中build的作用及其与 热部署&debug断点消失的关系
显然本地代码做了改动但String a = "a"的断点还是生效的
问题来了,此时的debug到底是以服务器代码为准呢 还是本地代码?

用膝盖想都知道是以服务器中代码为准 因为此时没有将本地代码更新进服务器啊

关于IDEA中build的作用及其与 热部署&debug断点消失的关系
可以看到 刚刚到 String a = "a"这一句 a的值已经出来了 显然超前了一步

2. 如果本地代码改变了 导致无法打断点的代码可以被打上断点了 那么debug时他们真的会被调试到么 – 当然不能 一样的道理,以服务器为准


表达能力很差 各位将就着看 见谅

 

 

 

关于IDEA中build的作用及其与 热部署&debug断点消失的关系

上一篇:VB网络编程中Winsock的使用


下一篇:SQL注入