首先通过这篇文章,你可以了解到:
springboot中热部署的操作和原理。 devtools是如何触发的。哪些资源是需要重启,哪些资源是自动重新加载就行的IDEA中SpringBoot项目热部署配置。
在springboot 中 有提供热部署服务的插件 Springboot devtools
这里介绍 的是Maven的配置方式,Gradle请看官网配置
官方文档 2.1.5 RELEASE版本 关于热部署 devtools 介绍
https://docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/htmlsingle/#using-boot-devtools-livereload
首先需要在Maven的pom文件中添加依赖
Maven.
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> </dependencies>在这里说明:
当你是 Java -jar 运行项目时,会视为 在生产环境运行,如果怕影响,请在 配置文件中设置 -Dspring.devtools.restart.enabled=false
为什么这样说呢?
官网中有这么一句话:
spring-boot-devtools 默认禁用掉了 缓存,这是因为热部署是在开发工程中使用到的,虽然缓存在生产中非常有用,但在开发过程中可能会适得其反,使您无法看到刚刚在应用程序中进行的更改。像thymeleaf模板引擎的cache,所以当配置到生产环境时请建议禁用热部署
这是SpringBoot在GitHub源码中 对于 devtools 默认配置
static { Map<String, Object> properties = new HashMap<>(); 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.resources.cache.period", "0"); properties.put("spring.resources.chain.cache", "false"); properties.put("spring.template.provider.cache", "false"); properties.put("spring.mvc.log-resolved-exception", "true"); properties.put("server.error.include-stacktrace", "ALWAYS"); properties.put("server.servlet.jsp.init-parameters.development", "true"); properties.put("spring.reactor.stacktrace-mode.enabled", "true"); PROPERTIES = Collections.unmodifiableMap(properties); }Triggering a restart 由于DevTools监视类路径资源,因此触发重新启动的唯一方法是更新类路径。 导致更新类路径的方式取决于您使用的IDE。 在Eclipse中,保存修改后的文件会导致更新类路径并触发重新启动。 在IntelliJ IDEA中,构建项目(Build - > Build Project)具有相同的效果。
在官网的 热部署自动触发中有这么两段话:
简单说,就是 在 Maven 或者 Gradle 中 在 build plugins中 启动 forking,Maven或者 Gradle 中才能检测 类路径中的devtools,从而检测到类路径资源的修改。 所以我们需要在 Maven的pom文件中配置 fork 属性
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!--启用fork,用来maven检测类路径资源的改动 --> <fork>true</fork> </configuration> </plugin> </plugins> </build>它是配合着 LiveReload 使用的。
这里我们可以从配置了热部署的项目启动中看到
默认中 某些资源在更改时不一定需要触发重启。 例如,可以编辑Thymeleaf模板。 默认情况下,更改/ META-INF / maven,/ META-INF / resources,/ resources,/ static,/ public或/ templates中的资源不会触发重新启动,但会触发实时重新加载。
是不是很眼熟? 它是默认设置 和 eclipse中web项目改动后自动编译情况是一模一样的,src/main/java下的代码修改会重新启动项目,当前端 jsp页面改动保存后会自动加载,只需要在浏览器刷新一下就行。(这么说来 eclipse是自动带了 热部署哈!)
如果要自定义这些排除项,可以使用spring.devtools.restart.exclude属性。 例如,要仅排除/ static和/ public,您需要设置以下属性:
spring.devtools.restart.exclude=static/**,public/**
讲道理,这一步我未使用也可以,如果你们运行无效果,再进行这步操作把,我是在一些热部署教程中看到了这步操作。