众所周知,使用热部署可以避免每次后台代码改动都要重启IDEA,大大提高了开发效率。通常使用devtools等第三方jar包进行热部署,能不能不通过devtools实现热部署呢 最近发现IDEA的build居然有类似于热部署的功能(用了这么久的IDEA 居然不知道这个 QAQ 有点捞)
在切入正题之前需要了解一下IDEA的debug,了解完了之后 build的作用也就昭然若揭了
相信在使用IDEA的时候 很多人都遇到过打不上断点的情况,原因就是部署到服务器上的代码中该行无法被debug
e.g. 项目启动时:
以上,springboot项目启动后,打了三个断点, 位于14 15 18 行 ,其中18行没有可执行的代码所以断点被禁用 呈灰色
此时 服务器中运行的代码和本地代码是完全一致的
之后按回车键 让代码下移两行
可以看到原先的15行被挤到了17行,由于服务器中17行是空白行,所以此时断点会失效
继续下移一行 :
此时 String a = "a"
和 String b = "b"
的断点全部失效 因为服务器上的17 18两行都是无法打断点的回到第一张图,我们在第一张图中加上两句:
还是由于上述原因,这两行的断点是消失的,因为它们没有被加载服务器中,即服务器中的版本里17 18行是无法被debug的。解决方法:
build
> build project
此时debug按钮又生效了:
显然build可以将本地的最新内容更新进服务器 ,从而实现类似热部署的功能(无需重启项目)
此时我么可以毫无影响对新增代码进行debug :
然而要注意,以上方法局限于对类中方法的改动,如果是类的结构进行改动,这些改动无法通过build被更新进服务器 :
build之后它们的断点还是无法生效 显然build无法加载类级别的改动:
文章到此可结束了 以下是我处于对debug的好奇 做了几个测试
从上文可以知道 保证本地代码和服务器端同步似乎是debug的内在要求(这是合乎情理的 如果二者不同步还调试个卵子)
1. 如果本地代码变动了 但是断点没失效会怎么样呢:
e.g. 刚开始的状态(同步状态)
让代码下移一行:
显然本地代码做了改动但String a = "a"
的断点还是生效的
问题来了,此时的debug到底是以服务器代码为准呢 还是本地代码?
用膝盖想都知道是以服务器中代码为准 因为此时没有将本地代码更新进服务器啊
可以看到 刚刚到 String a = "a"
这一句 a的值已经出来了 显然超前了一步
2. 如果本地代码改变了 导致无法打断点的代码可以被打上断点了 那么debug时他们真的会被调试到么 – 当然不能 一样的道理,以服务器为准