Java-SpringBoot-16-spring-boot-devtools

简介: Spring Boot包含一组开发工具,就是spring-boot-devtools模块。包含了属性默认值 自动重启 实时重新加载 全局设置 远程应用等内容。

Spring Boot包含一组开发工具,就是spring-boot-devtools模块。包含了属性默认值 自动重启 实时重新加载 全局设置 远程应用等内容。

       一般使用的是spring-boot-devtools模块对应用程序快速重启的支持,实现热部署,也叫热插拔。

使用必须先在pom.xml中引入:

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

热部署为啥快呢?

       Spring Boot提供的重启技术通过使用两个类加载器来工作。不变的类(例如,来自第三方jar的类)将被加载到基类加载器中。正在开发的类将加载到重新启动类加载器中。重新启动应用程序后,将丢弃重新启动类加载器,并创建一个新的类加载器。这种方法意味着应用程序的重启通常比“冷启动”要快得多,因为基本类加载器根本无需重新加载,只加载你开发的类就好了。

       如果你开发的类多到你还是启动速度不够快,去搜的试试JRebel,我不想看这个。

一、属性默认值

       Spring Boot支持的一些库使用缓存来提高性能。例如,模板引擎缓存已编译的模板,以避免重复解析模板文件。而且,Spring MVC可以在提供静态资源时将HTTP缓存标头添加到响应中。

       生产中缓存可以提升应用性能,但在开发过程中可能适得其反,从而无法看到自己刚刚在应用程序中所做的更改。因此,spring-boot-devtools默认禁用缓存选项。

下面是一些默认的属性值:

Map<String, Object>properties=newHashMap<>();
properties.put("spring.thymeleaf.cache", "false");
properties.put("spring.freemarker.cache", "false");
properties.put("spring.groovy.template.cache", "false");
properties.put("spring.mustache.cache", "false");
properties.put("server.servlet.session.persistent", "true");
properties.put("spring.h2.console.enabled", "true");
properties.put("spring.web.resources.cache.period", "0");
properties.put("spring.web.resources.chain.cache", "false");
properties.put("spring.template.provider.cache", "false");
properties.put("spring.mvc.log-resolved-exception", "true");
properties.put("server.error.include-binding-errors", "ALWAYS");
properties.put("server.error.include-message", "ALWAYS");
properties.put("server.error.include-stacktrace", "ALWAYS");
properties.put("server.servlet.jsp.init-parameters.development", "true");
properties.put("spring.reactor.debug", "true");
PROPERTIES=Collections.unmodifiableMap(properties);

如果不想应用属性默认值,可以在应用程序中设置spring.devtools.add-properties为false。

       application.properties文件中的配置也可以覆盖以上默认属性。

       由于在开发Spring MVC和Spring WebFlux应用程序时需要有关Web请求的更多信息,因此开发人员工具将启用DEBUG日志web记录组的日志记录。这将为您提供有关传入请求,正在处理的处理程序,响应结果等的信息。如果您希望记录所有请求的详细信息(包括潜在的敏感信息),则可以打开spring.mvc.log-request-details或spring.codec.log-request-details配置属性。

二、自动重启

       只要类路径上的文件发生更改,使用的应用程序就会自动重启。当DevTools 监视类路径资源时,触发重启的唯一方法是更新类路径。

导致类路径更新的方式取决于您使用的IDE:

  • 在Eclipse中,保存修改后的文件会导致类路径更新并触发重启。
  • 在IntelliJ IDEA中,构建项目(Build +→+ Build Project)也有同样的效果。
  • 如果使用构建插件,运行Maven的mvn编译或gradle的Gradle构建将触发重启。

DevTools依赖于应用程序上下文的关闭挂钩在重新启动期间将其关闭。

       如果禁用了下面这个关机挂钩,就不能用了。

           SpringApplication.setRegisterShutdownHook(false)

       使用JRebel,自动重启将被禁用,以支持动态类重载。

       使用LiveReload,自动重启不影响。

       默认情况下,每次您的应用程序重新启动时,都会记录一个报告,其中显示了条件评估增量。该报告显示了在进行更改(例如添加或删除Bean以及设置配置属性)时对应用程序自动配置的更改。

要禁用报告的日志记录,请设置以下属性:

spring.devtools.restart.log-condition-evaluation-delta=false

某些资源在更改时不一定需要触发重新启动。例如,Thymeleaf模板只能就地编辑。默认情况下,改变资源/META-INF/maven,/META-INF/resources,/resources,/static,/public或 /templates不会触发重新启动,但会引发现场重装。使用spring.devtools.restart.exclude属性可以自定义这些排除项,也可以来控制其他路径下的更改是触发完全重新启动还是实时重新加载。

#例如,仅排除/static,/public设置以下内容:
spring.devtools.restart.exclude=stati/**,public/**# 如果要保留这些默认值并添加其他排除项,请改用spring.devtools.restart.additional-exclude=stati/**,public/**# 当对不在类路径上的文件进行更改时,可能希望重新启动或重新加载应用程序。spring.devtools.restart.additional-paths= # 禁用重新启动功能。spring.devtools.restart.enabled=false# 使用触发文件 spring.devtools.restart.trigger-file属性
#要使用触发文件,请将spring.devtools.restart.trigger-file属性设置为触发文件的名称(不包括任何路径)。#触发文件必须出现在您的类路径上。#例如,如果您的项目具有以下结构:src+-main+-resources+- .reloadtrigger#就这么配置:
spring.devtools.restart.trigger-file=.reloadtrigger

自定义重启类加载器

       可以创建一个META-INF/spring-devtools.properties文件。

包含restart.exclude.和 带有restart.include.前缀的属性。

  • include元素是应该被拉高到“restart”的类加载器的项目
  • exclude要素是应该向下推入“base”类加载器的项目。
#属性值是将应用于类路径的正则表达式模式。restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jarrestart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar#重新启动功能不适用于使用标准反序列化的ObjectInputStream对象。#如果您需要反序列化数据,则可能需要结合使用Spring的ConfigurableObjectInputStream和Thread.currentThread().getContextClassLoader()#所有属性键都必须是唯一的。只要属性以restart.include.或开头,restart.exclude.就可以考虑。

三、LiveReload

       spring-boot-devtools模块包括一个嵌入式LiveReload服务器,该服务器可用于在更改资源时触发浏览器刷新。可从livereload.com免费获得适用于Chrome,Firefox和Safari的LiveReload浏览器扩展 。

#在应用程序运行时禁止启动LiveReload服务器spring.devtools.livereload.enabled=false。

一次只能运行一台LiveReload服务器。在启动应用程序之前,请确保没有其他LiveReload服务器正在运行。如果从IDE启动多个应用程序,则只有第一个将具有LiveReload支持。要在文件更改时触发LiveReload,必须启用“自动重启”。

#可以设置按一定的时间间隔轮询类更改spring.devtools.restart.poll-interval=2sspring.devtools.restart.quiet-period=1s#现在每2秒轮询一次受监视的类路径目录以查找更改,并保持1秒钟的静默时间以确保没有其他类更改。

四、运行远程客户端应用程序

       DevTools的远程支持需要确保已将devtools其包含在重新打包的存档中,如下所示:

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludeDevtools>false</excludeDevtools></configuration></plugin></plugins></build>


这是上篇文章学过的,要把工具类打包到jar中,确保支持远程。

       接着要设置一个密钥:

spring.devtools.remote.secret=admin

远程devtools支持分为两部分:接受连接的服务器端端点和在IDE中运行的客户端应用程序。

       spring.devtools.remote.secret设置属性后,将自动启用服务器组件。客户端组件必须手动启动。

运行:

       远程客户端应用程序设计为在您的集成开发环境中运行。

org.springframework.boot.devtools.RemoteSpringApplication类路径需要与连接的远程项目的类路径相同。应用程序唯一需要的参数是它所连接的远程URL。

例子:

例如,如果您使用的是Eclipse或STS,并且您有一个my-app已部署到CloudFoundry的项目,则可以执行以下操作:
选择RunConfigurations…从Run菜单。创建一个新的JavaApplication“launchconfiguration”。浏览该my-app项目。使用org.springframework.boot.devtools.RemoteSpringApplication作为主类。添加https://myapp.cfapps.io 到 Program arguments(或任何您的远程URL)。

如果需要使用代理来访问远程应用程序:

spring.devtools.remote.proxy.host=xxxspring.devtools.remote.proxy.port=8080

远程更新和重新启动比完整的重建和部署周期要快得多,也就是说可以用来实现远程部署。


五、测试

引入依赖:

<!--https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency>

启动项目,发现日志打出了远程服务器已经在 35729端口启动了:

image.png

一些常用的配置:

#####################devtools######################是否应用属性默认值spring.devtools.add-properties=true#仅排除/static/public下的所有文件spring.devtools.restart.exclude=static/**,public/**# 禁用报告的日志记录 该报告显示了在进行更改(例如添加或删除Bean以及设置配置属性)时对应用程序自动配置的更改spring.devtools.restart.log-condition-evaluation-delta=false# 如果要保留这些默认值并添加其他排除项,请改用#spring.devtools.restart.additional-exclude=static/**,public/**# 当对不在类路径上的文件进行更改时,可能希望重新启动或重新加载应用程序。#spring.devtools.restart.additional-paths= # 禁用重新启动功能。spring.devtools.restart.enabled=true# 使用触发文件 #spring.devtools.restart.trigger-file=.reloadtrigger# 在应用程序运行时禁止启动LiveReload服务器spring.devtools.livereload.enabled=true

这样在修改完类路径下的文件并保存时,就会触发实时重启。



总结:

       就是一个SpringBoot的devTools工具模块,可以进行热部署。


END


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
4月前
|
缓存 Java Maven
4:SpringBoot-Starter-Java Spring
4:SpringBoot-Starter-Java Spring
26 0
|
4月前
|
监控 前端开发 Java
5:SpringBoot-Actuator-Java Spring
5:SpringBoot-Actuator-Java Spring
31 0
|
6月前
|
XML 监控 Java
【Java】Spring Boot项目的创建和使用
【Java】Spring Boot项目的创建和使用
|
6月前
|
JSON Java 数据库
【Java】Spring Boot 配置文件
【Java】Spring Boot 配置文件
|
4月前
|
XML Java 应用服务中间件
3:SpringBoot-Java Spring
3:SpringBoot-Java Spring
22 0
|
10月前
|
Java Apache 项目管理
Java|怎样快速搭建一个spring boot项目
Java|怎样快速搭建一个spring boot项目
145 0
|
12月前
|
Java Maven Spring
Java 最常见的面试题:spring boot 有哪些方式可以实现热部署?
Java 最常见的面试题:spring boot 有哪些方式可以实现热部署?
|
Java Spring
【Java】【Spring Boot】CP01:创建一个SpringBoot项目(Spring Initializr)
【Java】【Spring Boot】CP01:创建一个SpringBoot项目(Spring Initializr)
209 0
【Java】【Spring Boot】CP01:创建一个SpringBoot项目(Spring Initializr)
|
Java Maven Spring
Java--SpringBoot-14-Spring Boot Maven Plugin-05
Spring Boot Maven Plugin 最主要的goals是repackage,它可以在maven打包完成以后,再重新打包成可执行的包!
108 0
|
缓存 Java Maven
Java--SpringBoot-13-Spring Boot Maven Plugin-04
Spring Boot Maven Plugin可以配置打包的内容,对包中的内容进行layers-分层。
126 0
Java--SpringBoot-13-Spring Boot Maven Plugin-04