Spring DevTools 介绍

Spring DevTools 介绍

Spring Boot包括一组额外的工具,可使应用程序开发体验更加愉快。 spring-boot-devtools模块能够包含在任何项目中,它能够节省大量的时间。 想要使用devtools支持,只需将模块依赖关系添加到你的构建中:css

Maven.html

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

Gradle.java

dependencies {
compile("org.springframework.boot:spring-boot-devtools")
}

运行打包的应用程序时,开发人员工具会自动禁用。若是你经过 java -jar或者其余特殊的类加载器进行启动时,都会被认为是“生产环境的应用”。git

将依赖标记为optional可选是一种最佳作法,能够防止将devtools依赖传递到其余模块中。Gradle 不支持开箱即用的optional依赖项,你能够参考propdeps-plugingithub

1、属性默认值

Spring Boot 支持的一些库中会使用缓存来提升性能。例如模版引擎将缓存编译后的模板,以免重复解析模板文件。 此外,Spring MVC能够在服务静态资源时向响应中添加HTTP缓存头。正则表达式

虽然缓存在生产中很是有益,但它在开发过程当中可能会产生反效果,它会阻止你看到刚刚在应用程序中进行的更改。 所以,spring-boot-devtools将默认禁用这些缓存选项。spring

缓存选项一般在application.properties文件中配置。 例如,Thymeleaf提供了spring.thymeleaf.cache属性。spring-boot-devtools模块不须要手动设置这些属性,而是自动应用合理的开发时配置。浏览器

2、自动重启

spring-boot-devtools会在类路径上的文件发生更改时自动重启。 这在IDE中工做时多是一个有用的功能,由于它为代码更改提供了很是快的反馈循环。 默认状况下会监视类路径上的全部变更,但请注意,某些资源(如静态资源和视图模板)不须要重启应用程序。缓存

触发重启服务器

当DevTools监视类路径资源时,触发重启的惟一方法是更新类路径。 致使类路径更新的方式取决于你正在使用的IDE。在Eclipse中,保存修改的文件将致使类路径被更新并触发重启。 在IntelliJ IDEA中,构建项目( Build -> Make Project )将具备相同的效果。

从新启动和从新加载

Spring Boot提供的从新启动技术使用了两个类加载器。 不改变的类(例如,来自第三方jar的)被加载到 base 类加载器中。 你正在开发的类被加载到 restart 类加载器中。 当应用程序重启时, restart加载器将被丢弃,并建立一个新的类加载器。 这种方法意味着应用程序重启一般比“冷启动”快得多,由于 base 加载器已经已加载而且可用。

1. 排除资源

某些资源在更改时不必定须要触发重启。 例如,能够直接编辑Thymeleaf模板。 默认状况下,更改/META-INF/maven/META-INF/resources/resources/static/public/templates中的资源不会触发重启,但会触发实时从新加载。 若是要自定义这些排除项,可使用spring.devtools.restart.exclude属性。 例如,要仅排除/static/public你将设置如下内容:

spring.devtools.restart.exclude = static / **,public / **

若是你想保留上面的默认(状况下的)值并添加其余的排除项,你可使用

spring.devtools.restart.additional-exclude 属性。

2. 监控额外的路径

当你对不在类路径中的文件进行更改时,可能须要重启或从新加载应用程序。 为此,请使用spring.devtools.restart.additional-paths属性来配置监视其余路径的更改。 你可使用上述的spring.devtools.restart.exclude属性来控制附加路径下的更改是否会触发彻底重启或只是实时从新加载 。

3. 禁用重启

若是不想使用重启功能,可使用spring.devtools.restart.enabled属性来禁用它。 在大多数状况下,你能够在application.properties中设置此项(这仍将初始化重启类加载器,但不会监视文件更改)。

例如,若是你须要彻底禁用重启支持,由于它不适用于特定库,则须要在调用SpringApplication.run(…)以前设置System属性。 例如:

public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}

4. 使用触发文件

若是你使用自动编译已更改文件的IDE,则可能但愿仅在特定时间触发重启。 为此,你可使用“触发文件”,这是一个特殊文件,当你要实际触发重启检查时,必须修改它。 更改文件只会触发检查,只有在Devtools检测到它必须执行某些操做时才会重启。 触发文件能够手动更新,也能够经过IDE插件更新。

要使用触发器文件,请使用spring.devtools.restart.trigger-file属性。

若是你但愿将spring.devtools.restart.trigger-file设置为全局配置,能够参考下面第四小节。

5. 自定义重启类加载器

如上面从新启动和从新加载部分所述,重启功能是经过使用两个类加载器实现的。 对于大多数应用程序,此方法运行良好,但有时可能会致使类加载问题。

默认状况下,IDE中的任何打开的项目都会使用“restart”类加载器加载,任何常规.jar文件将使用“base”类加载器加载。 若是你在多模块项目上工做,但不是每一个模块都导入到IDE中,则可能须要自定义配置。 为此,你能够建立一个META-INF/spring-devtools.properties文件。

spring-devtools.properties文件能够包含restart.exclude.restart.include. 前缀的属性。 include元素是应该被放入“restart”类加载器的项目, exclude元素是应该放入“base”类加载器的项目。 属性的值是应用于类路径下的正则表达式。

例如:

restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar

针对通用Mapper,能够作以下配置:

restart.include.mapper=/mapper-[\\w-\\.]+jar

全部属性的键值(名字,companycommonlibs 部分)必须是惟一的,只有 restart.exclude.restart.include. 开头的属性有效。

全部类路径下面的 META-INF/spring-devtools.properties 配置文件都会生效,因此你能够把该配置打包到每一个模块中。

注:新版本的Mapper(3.4.1+)会默认增长该配置。

6. 已知限制

重启功能对使用标准ObjectInputStream对象序列化的对象不是很好 。若是须要反序列化数据,可能须要使用Spring的ConfigurableObjectInputStream配合Thread.currentThread().getContextClassLoader() 使用。

不幸的是,一些第三方库都不考虑在使用上下文类加载器的状况下反序列化。 若是你发现这样的问题,你须要向原做者请求修复。

3、实时加载

spring-boot-devtools模块包含嵌入式LiveReload服务器,能够在资源更改时用于触发浏览器刷新。 LiveReload浏览器扩展程序支持Chrome,Firefox和Safari,你能够从livereload.com免费下载。

若是你不想在应用程序运行时启动LiveReload服务器,则能够将spring.devtools.livereload.enabled属性设置为false

同一时间只能运行一个LiveReload服务器。 开始应用程序以前,请确保没有其余LiveReload服务器正在运行。若是从IDE启动多个应用程序,则只有第一个应用程序将支持LiveReload。

4、全局设置

你能够经过向$HOME文件夹添加名为.spring-boot-devtools.properties的文件来配置全局devtools设置(请注意,文件名以“.”开头)。 添加到此文件的任何属性将适用于你的计算机上使用devtools的全部 Spring Boot应用程序。 例如,要配置重启始终使用触发器文件 ,你能够添加如下内容:

〜/ .spring-boot-devtools.properties。

spring.devtools.reload.trigger-file=.reloadtrigger

Spring Boot 系列

  1. Spring Boot 入门

  2. Spring Boot 属性配置和使用

  3. Spring Boot 集成MyBatis

  4. Spring Boot 静态资源处理

  5. Spring Boot - 配置排序依赖技巧

  6. Spring Boot - DevTools 介绍