天天看点

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

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

在切入正题之前需要了解一下IDEA的debug,了解完了之后 build的作用也就昭然若揭了

相信在使用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时他们真的会被调试到么 – 当然不能 一样的道理,以服务器为准

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