Idea实现热部署有两种方式,互为补充。
一. SpringLoader热部署
只能做代码热部署,不能做静态资源热部署。静态资源包括但不限于: html,css,js。SpringLoader做热部署 时有两种配置方式。
1. 使用插件启动
在maven的pom.xml中添加对应的依赖
org.springframework.boot
spring-boot-maven-plugin
org.springframework
springloaded
1.2.8.RELEASE
loader.AppStarter
其中,mainClass的路径可以不指定,但spriongloaded的依赖一定要写,否则只凭借spring-boot-maven-plugin中的spring-boot-loader无法完成热部署的功能。
接着,在插件中通过spring-boot:run 来启动应用,即可实现热部署功能。(不能直接通过主类启动)
2. 通过代码依赖外部 jar启动
在Run/Debug Configuration-> VM options中添加内容并启动即可实现热部署:
-javaagent:.\libs\springloaded-1.2.8.RELEASE.jar -noverify
注意,jar包不需要add to build path。
3. 注意
Idea并没有像eclipse那样默认自动编译文件,因此需要手动开启,网上大部分人都说有两处:
1. Compiler -> Build project automatically 打钩
2. ctrl shift+A -> Registry -> compiler.automake.allow.when.app.running 打钩
然而并没有用,我的Idea是2019.1,亲测上述配置无效。因此退而求其次,录制了一套保存+编译的宏命令,并设置快捷键为ctrl+s,每次修改一个类后,手动ctrl+s进行编译。
宏的定义如下图所示:
二. DevTools
既可以做代码热部署,也能做静态资源热部署。当实现代码热部署时,需要与springloaded搭配使用。引入springloaded的方式请参考前文,下面是DevTools集成至spring boot的方式:
首先,在maven的pom.xml中引入DevTools依赖
org.springframework.boot
spring-boot-devtools
true
接着,在application.properties全局配置文件中,增加对DevTools的配置:
# DevTools热部署生效
spring.devtools.restart.enabled=true
# 设置文件内容发生变化时需要重启服务的路径 如果路径有多个,用英文逗号分隔
spring.devtools.restart.additional-paths=src/main/java
# 设置文件内容发生变化时不需要重启服务的路径
# 注意: 默认不重启服务的路径有: /META-INF/maven, /META-INF/resources,/resources,/static/templates,/public
# 不重启服务,但还是会重新加载静态内容! 也即,静态资源的热部署还是有效的
spring.devtools.restart.exclude=WEB-INF/**
至此,针对DevTools做热部署的工作就已经完成了。
与单纯使用springloaded不同的是,使用DevTools时,spring boot会分出名为"restartedMain"的线程去监听.class文件,如果发现有文件被修改,则会重启服务(在控console中能看到Spring上下文重启的相关信息)