新闻资讯
springboot实现热部署的三种方式(二)——spring-boot-devtools
spring-boot-devtools 为应用提供一些开发时特性,包括默认值设置,自动重启,livereload等。
1、pom依赖
想要使用devtools热部署功能,maven添加依赖如下:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> </dependencies>
将依赖关系标记为可选<optional>true</optional>是一种最佳做法,可以防止使用项目将devtools传递性地应用于其他模块。
2、默认属性
在spring boot继承thymeleaf时,spring.thymefeaf.cache属性设置为false可以禁用模板引擎编译的缓存结果。
现在,devtools会自动帮你做到这些,禁用所有模板的缓存,包括 Thymeleaf, Freemarker, Groovy Templates, Velocity, Mustache等。
3、自动重启
自动重启的原理在于spring boot使用两个classloader:不改变的类(如第三方jar)由base类加载器加载,正在开发的类由restart类加载器加载。应用重启时,restart类加载器被扔掉重建, 而base类加载器不变,这种方法意味着应用程序重新启动通常比“冷启动”快得多,因为base类加载器已经可用并已填充。
所以,当我们开启devtools后,classpath中的文件变化会导致应用自动重启。
当然不同的IDE效果不一样,eclipse中保存文件即可引起classpath更新,从而触发重启。而idea则需要自己手动Ctrl+F9重新编译一下。
(1)排除静态资源文件
静态资源文件在改变之后有时候没必要触发应用程序重启,例如thymeleaf模板文件就可以实时编辑,默认情况下,更改 /META-INF/maven, /META-INF/resources ,/resources ,/static ,/public 或/templates下 的资源不会触发重启,而是触发live reload(devtools内嵌了一个liveReload server,当资源发生改变时,浏览器刷新,下面会介绍)。
可以使用spring.devtools.restart.exclude属性配置,例如
spring.devtools.restart.exclude=static/**,public/**
如果想保留默认配置,同时增加新的配置,则可使用
spring.devtools.restart.additional-exclude属性
(2)观察额外的路径
如果你想观察不在classpath中的路径的文件变化并触发重启,则可以配置 spring.devtools.restart.additional-paths 属性。
不在classpath内的path可以配置spring.devtools.restart.additionalpaths属性来增加到监视中,同时配置spring.devtools.restart.exclude可以选择这些path的变化是导致restart还是live reload。
(3)关闭自动重启
设置 spring.devtools.restart.enabled 属性为false,可以关闭该特性。可以在application.properties中设置,也可以通过设置环境变量的方式。
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
(4)使用一个触发条件
若不想每次修改都触发自动重启,可以设置spring.devtools.restart.trigger-file指向某个文件,只有更改这个文件时才触发自动重启。
(5)自定义自动重启类加载器
默认情况下,IDE中打开的项目都会由restart加载器加载,jar文件由base加载器加载,但是若你使用multi-module的项目,并且不是所有模块都被导入IDE中,此时会导致加载器不一致。这时你可以创建 META-INF/spring-devtools.properties文件, 并增加 restart.exclude.XXX,restart.include.XXX来配置哪些jar被restart加载,哪些被base加载。如:
restart.include.companycommonlibs=/mycorp-common-[\\w-]+\.jar restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
4、LiveReload
DevTools内置了一个LiveReload服务,可以在资源变化时用来触发浏览器刷新。当然这个需要你浏览器安装了LiveReload插件,并且启动这个插件才行。
先去谷歌商店安装LiveReload插件,自己准备梯子。
安装好在要自动刷新的页面点击下图中图标,启动应用后更新页面内容或者css等都会触发页面自动刷新了。
最后展示效果,修改完html页面后,Ctrl+Shift+F9,没有重启,页面也会自动刷新了,太有趣了。
如果您不想在应用程序运行时启动LiveReload服务器,则可以将spring.devtools.livereload.enabled属性设置为false。
一次只能运行一个LiveReload服务器。开始应用程序之前,请确保没有其他LiveReload服务器正在运行。
如果你的IDE启动多个应用程序,则只有第一个应用程序将支持LiveReload。
原文链接:https://my.oschina.net/u/4006148/blog/3173833
回复列表