SpringBoot热部署-IDEA中的相应配置

    xiaoxiao2022-07-02  105

    首先通过这篇文章,你可以了解到:

    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 disables the caching options by default.

    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); }

    那么 Spring-boot-devtools 热部署是如何触发的呢?

     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/**

    关于IDEA 的 配置了

    第一步: 启动自动编译         在IDEA中依次点击 File -》 Settings -》Compiler , 勾选 Build Project automatically 

     

     第二步: 运行该项目自动编译     组合键:“Shift+Ctrl+Alt+/” ,选择 “Registry” ,选中打勾 “compiler.automake.allow.when.app.running” 。

    讲道理,这一步我未使用也可以,如果你们运行无效果,再进行这步操作把,我是在一些热部署教程中看到了这步操作。

     

    重启项目,就会发现在前端等资源的修改,只要刷新浏览器界面就可以出现了。

    最新回复(0)