Spring Boot 提供了一套额外的工具,可以提升应用程序开发的体验,只用在项目中包含 spring-boot-devtools
模块就行。该模块会在开发模式下设置一些默认的属性,例如:禁用缓存、设置日志等级;还会监听 classpath 的变化,自动的重启应用。
spring-boot-devtools
给开发带来了很多的便利,这篇文章总结可它的一些用法。
添加模块依赖
要使用 devtools,需要先添加模块依赖,Maven 和 Gradle 的配置如下:
Maven:
org.springframework.boot
spring-boot-devtools
true
Gradle:
configurations {
developmentOnly
runtimeClasspath {
extendsFrom developmentOnly
}
}
dependencies {
developmentOnly("org.springframework.boot:spring-boot-devtools")
}
运行完整打包的应用时,开发工具会被禁用。当使用 java -jar
或者特殊的类加载器运行时,会被认为是生产环境。在 Maven 中使用
标记该依赖时可选的,或者在 Gradle 中使用自定义的 developmentOnly
配置可以防止开发工具应用到项目的其他模块。
默认配置
Spring Boot 中的一些库会通过缓存来提升性能。比如:模块引擎缓存已编译的模板,已避免重复解析模板文件;Spring MVC 在响应静态资源时设置 HTTP 缓存头。
启用缓存在开发环境中非常有用,但是在生产环境下却适得其反。因此 spring-boot-devtools
默认会为我们禁用掉缓存,而不用再去手动禁用了。
同时,开发工具还会将 Web 日志的等级设置为 DEBUG
,这样就可以看到更加详细的请求和响应信息。如果要记录所有请求详细信息(包括可能的敏感信息),可以启用 spring.http.log-request-details
。
如果不想使用默认的配置,可以设置 spring.devtools.add-properties
为 false
。
自动重启
当 classpath 上的文件发生修改时,使用了 spring-boot-devtools
的应用会自动重启。在开发过程中,会是一个有用的功能,因为可以快速地看到修改导致的变化。
由于 DevTools 监视 classpath 资源,因此触发重新启动的唯一方法是更新 classpath。在 Eclipse 中,默认在修改文件并保存时会自动编译,从而触发 classpath 更新,而 IntelliJ 中需要手动构建项目(Build -> Build Project
)才行。当然,IntelliJ 中也可以设置自动编译,但我觉得没有必要。
Devtools 通过两个类加载器来完成重启,对于第三方库等不会发生修改的类,使用 base 类加载器,用户编辑的类则使用 restart 类加载器。当应用重启时,restart 类加载器会被丢弃然后创建一个新的,这样会加快重启的速度。如果觉得重启不够快,可以考虑使用 JRebel,它通过重新载入类来实现热更新。
输出条件评估的变化
默认情况下,每次应用程序重新启动时,都会输出条件评估增量的报告。该报告显示了修改应用程序时自动配置的变化,例如:添加或删除 Bean 以及配置属性。
添加下面的配置可以关闭该日志:
spring.devtools.restart.log-condition-evaluation-delta=false
排除资源
某些资源在更改时不需要触发重启。默认情况下,/META-INF/maven
、/META-INF/resources
、/resources
, /static
、/public
或 /templates
中的资源发生修改时不会触发重启(但是会触发 live reload,见下文)。
如果想要自定义需要排除的目录,可以通过 spring.devtools.restart.exclude
属性配置(逗号分隔多个)。如果想要维持默认的配置额外的排除其他目录,可以通过 spring.devtools.restart.additional-exclude
属性配置。
监听其他路径
通过 spring.devtools.restart.additional-paths
可以配置额外的路径以监听变化。
禁用重启
如果不想使用重启功能,可以通过 spring.devtools.restart.enabled
属性设置。大多数情况下,直接在 application.properties
中设置即可。如果想要完全禁用重启,需要在调用 SpringApplication.run(…)
之前设置 spring.devtools.restart.enabled
System
属性为 false
:
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
使用触发文件
如果使用不断编译已更改文件的 IDE,可能更喜欢仅在特定时间触发重新启动。我们可以使用“触发器文件”,这是一个特殊文件,当想要实际触发重新启动检查时必须修改该文件。更改文件只会触发检查,只有在 Devtools 检测到必须执行某些操作时才会重新启动。触发器文件可以手动更新,也可以使用 IDE 插件更新。
将 spring.devtools.restart.trigger-file
属性设为触发文件路径。
LiveReload
spring-boot-devtools
模块包含一个嵌入式 LiveReload 服务器,可用于在资源更改时触发浏览器刷新。浏览器需要安装 LiveReload 插件。
如果不想启用 LiveReload 服务器,设置 spring.devtools.livereload.enabled
属性为 false
。
一次只能运行一个 LiveReload 服务器。如果从 IDE 启动多个应用程序,则只有第一个具有 LiveReload 功能。
全局配置
在 $HOME
目录下创建一个 .spring-boot-devtools.properties
文件,在里面添加全局的 devtools 设置。添加到此文件的任何属性都会应用到本机所有使用 devtools 的 Spring Boot 应用程序中。
参考链接
- Developer Tools