在开发项目过程中,当修改了某些代码后需要本地验证时,需要重启本地服务进行验证,启动这个
项目,如果项目庞大的话还是需要较长时间的,
spring
开发团队为我们带来了一个插件:
spring-boot
devtools
,很好的解决了本地验证缓慢的问题。
热部署实现演示
1
.添加
spring-boot-devtools
热部署依赖启动器
在
Spring Boot
项目进行热部署测试之前,需要先在项目的
pom.xml
文件中添加
spring-boot-devtools
热
部署依赖启动器:
<!-- 引入热部署依赖 --><dependency><groupId> org.springframework.boot </groupId><artifactId> spring-boot-devtools </artifactId></dependency
由于使用的是
IDEA
开发工具,添加热部署依赖后可能没有任何效果,接下来还需要针对
IDEA
开发
工具进行热部署相关的功能设置
2. IDEA
工具热部署设置
选择
IDEA
工具界面的【
File
】
->
【
Settings
】选项,打开
Compiler
面板设置页面
选择Build下的Compiler选项,在右侧勾选“Build project automatically”选项将项目设置为自动编
译,单击【
Apply
】
→
【
OK
】按钮保存设置
在项目任意页面中使用组合快捷键
“Ctrl+Shift+Alt+/”
打开
Maintenance
选项框,选中并打开
Registry
页面,具体如图
1-17
所示
列表中找到
“compiler.automake.allow.when.app.running”
,将该选项后的
Value
值勾选,用于指
定
IDEA
工具在程序运行过程中自动编译,最后单击【
Close
】按钮完成设置
3.热部署效果测试
启动chapter01http://localhost:8080/hello
页面原始输出的内容是
“hello Spring Boot”
。
为了测试配置的热部署是否有效,接下来,在不关闭当前项目的情况下,将
DemoController
类中的请
求处理方法
hello()
的返回值修改为
“
你好,
Spring Boot”
并保存,查看控制台信息会发现项目能够自动构
建和编译,说明项目热部署生效
可以看出,浏览器输出了“你好,Spring Boot”,说明项目热部署配置成功
该原理其实很好说明,就是我们在编辑器上启动项目,然后改动相关的代码,然后编辑器自动触发编译
替换掉历史的
.class
文件后,项目检测到有文件变更后会重启
srpring-boot
项目。
可以看看官网的触发描述:
可以看到,我们引入了插件后,插件会监控我们
classpath
的资源变化,当
classpath
有变化后,会触发
重启
这里提到了,该插件重启快速的原因:这里对类加载采用了两种类加载器,对于第三方
jar
包采用
base
classloader
来加载,对于开发人员自己开发的代码则使用
restartClassLoader
来进行加载,这使得比停
掉服务重启要快的多,因为使用插件只是重启开发人员编写的代码部分。
这边做个简单的验证:
@Componentpublic class Devtools implements InitializingBean {private static final Logger log = LoggerFactory . getLogger ( Devtools . class );@Overridepublic void afterPropertiesSet () throws Exception {log . info ( "guava-jar classLoader: " +DispatcherServlet . class . getClassLoader (). toString ());log . info ( "Devtools ClassLoader: " +this . getClass (). getClassLoader (). toString ());}}
排除资源
某些资源在更改后不一定需要触发重新启动。例如,
Thymeleaf
模板可以就地编辑。默认情况下,改变
资源
/META
-
INF/maven
,
/META
-
INF/resources
,
/resources
,
/static
,
/public
,
或
/templates
不触发重新启动,但确会触发现场重装。如果要自定义这些排除项,则可以使用该
spring.devtools.restart.exclude
属性。例如,仅排除
/static
,
/public
您将设置以下属性:
spring.devtools.restart.exclude = static/**,public/**