spring-boot-devtools
Spring Boot包含一组额外的工具,可以使应用程序开发体验更加愉快。该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") }
默认值设置
Spring Boot支持的几个依赖通过使用缓存来提高性能。例如,模板引擎缓存已编译的模板以避免重复解析模板文件。此外,Spring MVC可以在提供静态资源时为响应添加HTTP缓存标头。
虽然缓存在生产中非常有用,但在开发过程中可能会适得其反,无法看到刚刚在应用程序中进行的更改。因此,spring-boot-devtools默认禁用缓存选项。
缓存选项通常由application.properties
文件中的设置配置。例如,Thymeleaf提供该spring.thymeleaf.cache
属性。该spring-boot-devtools
模块不需要手动设置这些属性,而是在开发时自动进行合理的配置。
因为在开发Spring MVC和Spring Web Flux应用程序时需要有关Web请求的更多信息,所以开发人员工具将启用DEBUG日志web 记录组的日志记录。这将为您提供传入请求,处理程序正在处理它,响应结果等的信息。如果您希望记录所有请求详细信息(包括可能的敏感信息),则可以打开 spring.http.log-request-details
配置属性。
目前devtools提供如下默认值:
properties.put("spring.thymeleaf.cache", "false"); //thymeleaf是个模板引擎
properties.put("spring.freemarker.cache", "false");
properties.put("spring.groovy.template.cache", "false");
properties.put("spring.velocity.cache", "false");
properties.put("spring.mustache.cache", "false"); //mustache也是个模板
properties.put("server.session.persistent", "true");
properties.put("spring.h2.console.enabled", "true"); //h2是个内存db
properties.put("spring.resources.cache-period", "0");
自动重启
开启devtools后,classpath中的文件变化会导致应用自动重启。Eclipse中保存文件即可引起classpath更新(注:需要打开自动编译),从而触发重启。
如果不使用IDE,而是通过maven或者gradle的build插件来启动应用,也可以打开spring-boot-maven-plugin的fork配置,使得应用在单独进程中打开(这会使得应用使用自己的类加载器):
<build>
<plugins>
<!-- 添加spring-boot的maven插件 start-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
<!-- 添加spring-boot的maven插件 end-->
</plugins>
</build>
自动重启时记录变化
默认情况下,每次应用程序重新启动时,都会记录一个报告。该报告显示了在进行更改(例如添加或删除Bean以及设置配置属性)时应用程序自动配置的更改。
要禁用报告的日志记录,请设置以下属性:
spring.devtools.restart.log-condition-evaluation-delta=false
排除资源
某些资源在更改时不需要触发重启。如果要自定义这些排除项,可以使用该spring.devtools.restart.exclude
属性。例如,要排除/static,/public您将设置以下属性:
spring.devtools.restart.exclude=static/**,public/**
监视其他的path
不在classpath内的path可以配置spring.devtools.restart.additionalpaths属性来增加到监视中,同时配置spring.devtools.restart.exclude可以选择这些path的变化是导致restart还是live reload。
禁用重启
- 在application.properties中配置spring.devtools.restart.enabled=false,此时restart类加载器还会初始化,但不会监视文件更新。
- 在SprintApplication.run之前调用System.setProperty(“spring.devtools.restart.enabled”, “false”);可以完全关闭重启支持
如果需要完全禁用重新启动支持,则需要在调用之前将spring.devtools.restart.enabled
属性设置为false,如以下示例所示:
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
使用触发文件
若不想每次修改都触发自动重启,可以设置spring.devtools.restart.trigger-file指向某个文件,只有更改这个文件时才触发自动重启。
Live Reload
Devtools模块包含一个嵌入的LiveReload服务器,可以在资源变化时用来触发浏览器刷新。浏览器需要在livereload.com下载安装扩展。
例如Chrome浏览器在应用商店安装LiveReload插件后,在要自动刷新的页面点击下图中图标,启动应用后更新页面内容或者css等都会触发页面自动刷新。
全局设置
可以在$HOME路径下创建 .spring-boot-devtools.properties 文件,来包含所有使用了devtools的sprint boot应用都会使用的全局属性。例如,可以在文件中配置全局的trigger file:
~/.spring-boot-devtools.properties
spring.devtools.reload.trigger-file=.reloadtrigger
远程应用程序
Spring Boot开发人员工具并不局限于本地开发。在运行远程应用程序时,还可以使用几个特性。远程支持opt-in。要启用它,您需要确保重新打包的归档文件中包含devtools,如下面的清单所示:
<build>
<plugins>
<plugin>
<groupId> org.springframework.boot </ groupId>
<artifactId> spring-boot-maven-plugin </ artifactId>
<configuration>
<excludeDevtools> false </ excludeDevtools>
</ configuration>
</ plugin>
</ plugins>
</ build>
然后,您需要设置spring.devtools.remote.secret
属性,如以下示例所示:
spring.devtools.remote.secret = mysecret
TIPS:spring-boot-devtools
在远程应用程序上启用存在安全风险。永远不可在生产环境上启用。
运行远程客户端应用程序
远程客户端应用程序设计为在IDE中运行。需要使用org.springframework.boot.devtools.RemoteSpringApplication使用与连接到的远程项目相同的类路径运行 。应用程序的单个必需参数是它连接的远程URL。
例如,如果您正在使用Eclipse或STS,并且您有一个名为my-app您已经部署到CloudFoundry,您将执行以下操作:
- 选择Run Configurations…从Run菜单。
- 创建一个新的Java Application“启动配置”。
- 浏览my-app项目。
- 使用org.springframework.boot.devtools.RemoteSpringApplication作为主类。
- 添加https://myapp.cfapps.io到Program arguments(或任何远程URL)。
示例:
进行配置
服务就是一个普通的Spring Boot Web项目,首先需要对pom.xml稍作修改,添加 < excludeDevtools > false < /excludeDevtools> 打包时保留devtools:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludeDevtools>false</excludeDevtools>
</configuration>
</plugin>
application.properties中添加安全配置
spring.devtools.remote.secret=root
root相当于密码,client和remote server之间同步代码时就使用这个密码进行校验
启动远端服务器
- 远端服务模拟模拟在127.0.0.1:8081
- 项目根目录mvn package打包
- java -jar target/xxx.jar启动
- 启动日志中有一句不一样的日志输出
启动本地服务
- 本地服务使用idea启动在127.0.0.1:8082端口
- 指定Main Class为org.springframework.boot.devtools.RemoteSpringApplication
- 指定Program arguments为http://127.0.0.1:8081 即远端服务的地址
- 启动项目
tips:
- 如果本地与远端的spring.devtools.remote.secret配置不一致,则同步代码时会报错。
- 不可用在生产环境!!!