Spring Boot 开发工具的使用

编辑于2018年11月16日

Spring Boot 提供了一套额外的工具,可以提升应用程序开发的体验,只用在项目中包含 spring-boot-devtools 模块就行。该模块会在开发模式下设置一些默认的属性,例如:禁用缓存、设置日志等级;还会监听 classpath 的变化,自动的重启应用。
spring-boot-devtools 给开发带来了很多的便利,这篇文章总结可它的一些用法。

添加模块依赖

要使用 devtools,需要先添加模块依赖,Maven 和 Gradle 的配置如下:

Maven:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
  </dependency>
</dependencies>

Gradle:

configurations {
	developmentOnly
	runtimeClasspath {
		extendsFrom developmentOnly
	}
}
dependencies {
	developmentOnly("org.springframework.boot:spring-boot-devtools")
}

运行完整打包的应用时,开发工具会被禁用。当使用 java -jar 或者特殊的类加载器运行时,会被认为是生产环境。在 Maven 中使用 <optional>true</optional> 标记该依赖时可选的,或者在 Gradle 中使用自定义的 developmentOnly 配置可以防止开发工具应用到项目的其他模块。

默认配置

Spring Boot 中的一些库会通过缓存来提升性能。比如:模块引擎缓存已编译的模板,已避免重复解析模板文件;Spring MVC 在响应静态资源时设置 HTTP 缓存头。
启用缓存在开发环境中非常有用,但是在生产环境下却适得其反。因此 spring-boot-devtools 默认会为我们禁用掉缓存,而不用再去手动禁用了。
同时,开发工具还会将 Web 日志的等级设置为 DEBUG,这样就可以看到更加详细的请求和响应信息。如果要记录所有请求详细信息(包括可能的敏感信息),可以启用 spring.http.log-request-details
如果不想使用默认的配置,可以设置 spring.devtools.add-propertiesfalse

自动重启

当 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 应用程序中。

参考链接

  1. Developer Tools