问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Spring Boot开发工具devtools入门教程

创作时间:
作者:
@小白创作中心

Spring Boot开发工具devtools入门教程

引用
1
来源
1.
https://developer.aliyun.com:443/article/1636734

在Spring Boot开发调试中,如果每行代码的修改都需要重启再调试,可能会比较费时。Spring Boot团队为此提供了spring-boot-devtools(简称devtools)插件,以提升开发调试效率。本文将详细介绍devtools的配置和使用方法。

热部署和热加载

热部署和热加载是在应用正在运行的时候,自动更新(重新加载或者替换class等)应用的一种能力。

  • 热部署:在服务器运行时重新部署项目,它会重新加载整个应用,这种方式会释放内存,比热加载更加干净彻底,但同时也更费时间。
  • 热加载:在运行时重新加载class,从而升级应用。热加载的实现原理主要依赖java的类加载机制,在实现方式可以概括为在容器启动的时候起一条后台线程,定时的检测类文件的时间戳变化,如果类的时间戳变掉了,则将类重新载入。与反射机制不同,反射是在运行时获取类信息,通过动态的调用来改变程序行为;而热加载则是在运行时通过重新加载改变类信息,直接改变程序行为。

LiveLoad

LiveLoad是提供浏览器客户端自动加载更新的工具,分为LiveLoad服务器和Liveload浏览器插件两部分。devtools中已经集成了LiveLoad服务器,所以如果开发的是web应用,并且期望浏览器自动刷新,可以考虑使用LiveLoad。同一时间只能运行一个LiveReload服务器。开始应用程序之前,请确保没有其他LiveReload服务器正在运行。如果从IDE启动多个应用程序,则只有第一个应用程序将支持LiveReload。

配置devtools实现热部署

POM配置

添加spring-boot-devtools的依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional> <!-- 可以防止将devtools依赖传递到其他模块中 -->
    </dependency>
</dependencies>

IDEA配置

如果你使用IDEA开发工具,通常有如下两种方式:

  • 方式一:无任何配置时,手动触发重启更新(Ctrl+F9)
    (也可以用
    mvn compile
    编译触发重启更新)
  • 方式二:IDEA需开启运行时编译,自动重启更新
    设置1
    File->Setting->Build,Execution,Deployment->Compile
    勾选:Make project automatically

    设置2
    快捷键:ctrl+alt+shift+/
    选择:Registry
    勾选:compiler.automake.allow.when.app.running
    新版本的IDEA可以在File->setting->Advanced Setttings里面的第一个设置:

application.yml配置

spring:
  devtools:
    restart:
      enabled: true  #设置开启热部署
      additional-paths: src/main/java #重启目录
      exclude: WEB-INF/**
  thymeleaf:
    cache: false #使用Thymeleaf模板引擎,关闭缓存

使用LiveLoad

spring-boot-devtools模块包含嵌入式LiveReload服务器,可以在资源更改时用于触发浏览器刷新。LiveReload浏览器扩展程序支持Chrome,Firefox和Safari,可以从livereload.com免费下载。或者从浏览器插件中心下载,比如firefox。安装完之后,可以通过如下图标管理。如果你不想在应用程序运行时启动LiveReload服务器,则可以将spring.devtools.livereload.enabled属性设置为false。

进一步理解

devtool的原理

devtools使用了两个类加载器ClassLoader,一个ClassLoader加载不会发生更改的类(第三方jar包),另一个ClassLoader(restart ClassLoader)加载会更改的类(自定义的类)。后台启动一个文件监听线程(File Watcher),监测的目录中的文件发生变动时,原来的restart ClassLoader被丢弃,将会重新加载新的restart ClassLoader。因为文件变动后,第三方jar包不再重新加载,只加载自定义的类,加载的类比较少,所以重启比较快。

devtool是否会被打包进Jar

  • 默认情况下,不会被打包进JAR。运行打包的应用程序时,开发人员工具会自动禁用。如果你通过 java -jar或者其他特殊的类加载器进行启动时,都会被认为是“生产环境的应用”。
  • 如果期望远程调试应用(生产环境勿用,只有在受信任的网络上运行或使用 SSL 进行保护时,才应启用它),devtool也具备远程调试的能力。

devtool为何会默认禁用缓存选项

Spring Boot 支持的一些库使用缓存来提高性能。例如,模板引擎缓存已编译的模板以避免重复解析模板文件。此外,Spring MVC 可以在提供静态资源时向响应添加 HTTP 缓存标头。虽然缓存在生产中非常有益,但在开发过程中可能会适得其反,使你无法看到刚刚在应用程序中所做的更改。出于这个原因,spring-boot-devtools 默认禁用缓存选项。

devtool是否可以给所有Springboot应用做全局的配置

可以通过将spring-boot-devtools.yml文件添加到$HOME/.config/spring-boot目录来配置全局 devtools 设置。添加到这些文件的任何属性都适用于你机器上使用 devtools 的所有Spring Boot 应用程序。

如果我不用devtool,还有什么选择

如果不想使用devtool,可以考虑JRebel(它是收费的),或者在IDEA中使用Rebuild(Ctrl + Shift + F9)进行热更,或者使用spring loaded等工具。

示例源码

https://github.com/realpdai/tech-pdai-spring-demos

参考文章

https://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.devtools
https://liayun.blog.csdn.net/article/details/116541775

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号