spring-boot-devtools
devtools是spring boot中一个热部署插件,它通过监测类路径来及时发现文件的更新,当有文件更新后即触发一次重启。根据Spring Boot官方文档上的描述,devtools插件底层使用了两个类加载器,一个类加载器加载那些不会被更改的类(比如第三方的jar包),另一个官方称为“restart classloader”,专门来用来加载会被改变的类,由于发生变化的类通常很少,所以重启的速度比”冷启动“会快很多。
对Eclipse来说,这里需要先打开Eclipse的自动构建功能Build Automatically,让Eclipse重新编译,覆盖掉原有class文件,这样当devtools发现类路径下class文件发生变化后,才会重启,否则热部署无效。
实践
在实际的开发,只需要添加依赖即可;
通过spring.devtools.restart.enabled配置可以控制是否自动重启,一般开发情况下开启,生产环境下关闭(注意:在关闭的情况下,首次启动时仍会初始化"restart classloader",只是后续不再监听文件变化)
<dependency>
<groupId> org.springframework.boot </ groupId>
<artifactId> spring-boot-devtools </ artifactId>
<optional> true </ optional>
</ dependency>
spring.devtools.restart.enabled=false
排除资源
默认情况下,/META-INF/maven,、/META-INF/resources、/resources、/static、/public、/templates下文件的变化不会引起自动重启,通过spring.devtools.restart.exclude配置可自定义过滤。
如果想在保留这些配置的基础上,添加其它路径,通过spring.devtools.restart.additional-exclude指定。
整体来说,这个包括下面的,在实际中用的不多,只要注意将静态资源放到这些目录下就行。
spring.devtools.restart.exclude=static/**,public/**
spring.devtools.restart.additional-exclude=xx/**
添加资源
除了classpath路径下,你也可以指定其它监听路径,对应配置spring.devtools.restart.additional-paths
注意事项
- 根据官方描述,devtools在远程应用程序上启用存在安全风险,所以在生产环境上应该禁用,
应该排除devtools或设置spring.devtools.restart.enabled=false
- 如通过java -jar或自定义的classLoader启动方式都会被认为“生产环境”。
- 打包应用默认不会包含devtools,除非你禁用SpringBoot Maven插件的
excludeDevtools
属性。