34.SpringBoot开发者工具-devtools

Spring Boot包含一组额外的工具,可以使应用程序开发体验更加愉快。 spring-boot-devtools模块可以包含在任何项目中,以提供额外的开发时间功能。

Maven中引入devtools

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-devtools</artifactId>
   <optional>true</optional>
</dependency>
  • 自动重启

使用spring-boot-devtools的应用程序将在类路径上的文件发生更改时自动重新启动。 在IDE中工作时,这可能是一个有用的功能,因为它为代码更改提供了非常快速的反馈循环。 默认情况下,将监视类路径上指向文件夹的任何条目的更改。 请注意,某些资源(如静态资源和视图模板,也是html,css,js文件的改变不会触发重启)不需要重新启动应用程序。

什么时候触发重启
由于DevTools监视类路径资源,因此触发重新启动的唯一方法是更新类路径。 导致更新类路径的方式取决于您使用的IDE。 在Eclipse中,保存修改后的文件将导致更新类路径并触发重新启动。 在IntelliJ IDEA中,构建项目(Build - > Make Project)将具有相同的效果。

Spring Boot提供的重启技术使用两个类加载器。 不更改的类(例如,来自第三方jar的类)将加载到基类加载器中。 您正在积极开发的类将加载到重新启动的类加载器中。 重新启动应用程序时,将重新启动的类加载器并创建一个新的类加载器。 这种方法意味着应用程序重启通常比“冷启动”快得多,因为基类加载器已经可用并已填充。 如果发现重新启动对于应用程序来说不够快,或者遇到类加载问题,则可以考虑从ZeroTurnaround重新加载JRebel等技术。 这些工作通过在加载类时重写类使它们更适合重新加载。 Spring Loaded提供了另一种选择,但它不支持尽可能多的框架,并且它不受商业支持。

那些资源修改将不会触发重新启动

某些资源在更改时不一定需要触发重启。 例如,Thymeleaf模板可以就地编辑。 默认情况下,更改/ META-INF / maven,/ META-INF / resources,/ resources,/ static,/ public或/ templates中的资源不会触发重新启动,但会触发实时重新加载。 如果要自定义这些排除项,可以使用spring.devtools.restart.exclude属性。

例如自定义那个文件改动不触发重启:

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

 

监视额外的路径

当您对不在类路径中的文件进行更改时,您可能希望重新启动或重新加载应用程序。 为此,请使用spring.devtools.restart.additional-paths属性配置其他路径以监视更改。 您可以使用上述spring.devtools.restart.exclude属性来控制其他路径下的更改是触发完全重新启动还是仅实时重新加载。

禁用重启

如果您不想使用重启功能,可以在application.properites中设置spring.devtools.restart.enabled属性。如果您需要完全禁用重新启动支持,例如,因为它不能与特定库一起使用,则需要在调用SpringApplication.run(...)之前设置System属性。

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

spring-boot-devtools模块包含一个嵌入式LiveReload服务器,可用于在资源更改时触发浏览器刷新。 LiveReload浏览器扩展程序可从livereload.com免费用于Chrome,Firefox和Safari。 如果您不想在应用程序运行时启动LiveReload服务器,则可以将spring.devtools.livereload.enabled属性设置为false。

  • 刷新模板不需要重启容器

Spring Boot支持的大多数模板技术都包含一个禁用缓存的配置选项。 如果您正在使用spring-boot-devtools模块,那么在开发时将自动为您配置这些属性。

Thymeleaf模板

如果您使用的是Thymeleaf,将spring.thymeleaf.cache设置为false

FreeMarker模板

如果您使用的是FreeMarker,将spring.freemarker.cache设置为false

Groovy模板

如果您使用的是Groovy模板,将spring.groovy.template.cache设置为false

  • 刷新Java类不需要重启容器

现代IDE(Eclipse,IDEA等)都支持字节码的热交换,因此如果您进行的更改不会影响类或方法签名,则应该重新加载,没有任何副作用。 Spring Loaded更进一步,它可以通过方法签名的更改重新加载类定义。 通过一些自定义,它可以强制ApplicationContext自行刷新(但是没有通用的机制来确保对于正在运行的应用程序来说是安全的,所以它可能只是一个开发时间技巧)。

<plugin>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-maven-plugin</artifactId>
   <dependencies>
       <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>springloaded</artifactId>
          <version>1.2.6.RELEASE</version>
       </dependency>
    </dependencies>
</plugin>

 

 微信公众号

 

 

posted @ 2020-01-14 09:39  盲目的拾荒者  阅读(3416)  评论(0编辑  收藏  举报