参考:https://my.oschina.net/u/3555122/blog/4355953
1 为什么要使用热部署呢?
当我们修改了代码,想在 不重新运行项目的前提下, 就能看到修改后的效果,那么我们就可以使用热部署。这样可以大大提高我们的开发效率,省去重启项目所耗费的时间。
用法: 一般情况下,我们都是在启动debug模式 进行编码开发,当修改代码后,需进行测试时,可以直接快捷键 ctrl + F9
手动的对所有已修改的文件进行编译;;或者使用热部署,当使用了devtools
时,devtools就会自动的执行 编译以及重新部署项目的过程(这个过程需要等几秒)。 然后就可以访问到最新修改的内容了。
2 热部署的前提是
热部署的前提是:我们已经设置了IDEA 的自动编译配置。如下图。
3 方式一:手动触发编译(ctrl+F9:Build project )
在修改了代码之后,可以使用快捷键 ctrl + F9
,来手动触发重新编译。
Build project
原理: 把项目中变动了的.java文件,编译为最新的class文件,,然后,idea就会自动的部署最新的class文件。然后我们就可以访问到最新修改后的内容了。
注意: ctrl + shift + F9
,为Rebuild project
,与build的区别是,Rebuild project
是重新编译项目中的所有的文件(不管变动过还是没有变动过),而Build project
是只重新编译 那些变动过的.java 为class。因此Build project
耗费的时间更短一些,效率更高。
4 方式二:使用springboot的热部署插件 devtools
在 pom.xml 中添加如下配置,即可
<!--热部署配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
然后,然后当我们变动了代码之后,过几秒种,idea就会自动的完成编译,以及部署工作。然后我们就能访问到最新的修改过的内容了。
注意:
springboot中热部署的关键原理就是两个不同的classLoader。
base classloader
:用来加载不会变化的类,如:各种第三方依赖restart classloader
:用来加载会变化的类,例如:我们自己写的代码。
springboot的原理就是 当代码发生变化时,base classloader
不变,而restart classloader
则会被废弃,被另一个新的restart classloader
所代替。在整个过程中因为只重新加载了变化的类,所以热部署启动的速度比重新启动项目速度快。
缺点: 默认情况下,Java类发生变化会进行热部署,而静态资源文件变化时,不会进行热部署。可以使用 liveReload
。
5 几种编译快捷键的辨析:
Build(ctrl+F9)
:对选定的目标(Project),编译那些被修改的文件;
Rebuild(ctrl+shift+F9)
:对选定的目标(Project),进行强制性编译,不管目标是否是被修改过。由于 Rebuild 的目标只有 Project,所以 Rebuild 每次花的时间会比较长。
Recompile:
对选定的目标(Java 类文件),进行强制性编译,不管目标是否是被修改过。