Spring Boot DevTools开发者工具

Springboot提供了一套额外的工具,可以让你更加愉快的开发应用,spring-boot-devtools模块可以包含在任何项目中,以在开发期间提供一些有用的特性。要使用devtools,添加一i下依赖到项目中。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>

</dependencies>

  • 如果你的应用程序时通过 java -jar启动的,或者时一个特殊的classloader启动的,那么它就被认为是一个“生产级别的应用程序”,开发者工资会被自动禁用。你可以通过【spring.devtools.restart.enabled】配置属性来控制这一行为。要启用devtools,无论用于启动应用程序的类加载器是什么,请设置情动参数 【-Dspring.devtools.restart.enabled=true】在生产环境中不能这样做,因为运行devtools会有安全风险。要金庸devtools,请删除该依赖或者设置启动参数【-Dspring.devtools.restart.enabled=false】。
  • 应该在Maven中把这个scope标记为optional,或在Gradle中使用developmentOnly配置。以防止使用你的项目的替他模块,传递地依赖了devtools
  • 重新打包的压缩文件默认不包含devtools。如果你想使用某个远程devtool功能,你需要包含它,使用Maven插件时,将excludeDevtools属性设为false。

1. 诊断类加载问题

重启共嫩南瓜时通过使用两个classloader实现的。对于大多数应用程序来说,这总方法效果很好,然而,他有时会导致类加载问题,特别时在多模块项目中。

为了诊断加载问题是否确实是由devtools和它的 两个类加载器引起的,请试着金庸restart。如果这能解决你的问题,请定制restart类加载器以包括你的整个项目。

2. 属性的默认值

在springboot支持的一些库中,会使用缓存来提高性能。例如,模板引擎会缓存已编译的模板,以避免重复解析模板文件。另外,Sping MVC可以在响应静态资源时往响应总添加HTTP缓存头。

虽然缓存在生产中非常有益,但在开发过程中可能会产生反作用,使你无法看到你在应用程序中刚做的改动。由于这个原因【spring-boot-devtools】默认仅用了缓存选项。

缓存的选项通常时通过application.yml文件中的属性来配置的。例如,thymeleaf提供了spring.thymeleaf.cache[]属性,与其需要手动设置这些属性,spring-boot-devtools模块会在开发场景下合理的设置这些属性。

下表列出了所有被设置的属性:

NameDefault Value

server.error.include-binding-errors

always

server.error.include-message

always

server.error.include-stacktrace

always

server.servlet.jsp.init-parameters.development

true

server.servlet.session.persistent

true

spring.docker.compose.readiness.wait

only-if-started

spring.freemarker.cache

false

spring.graphql.graphiql.enabled

true

spring.groovy.template.cache

false

spring.h2.console.enabled

true

spring.mustache.servlet.cache

false

spring.mvc.log-resolved-exception

true

spring.reactor.netty.shutdown-quiet-period

0s

spring.template.provider.cache

false

spring.thymeleaf.cache

false

spring.web.resources.cache.period

0

spring.web.resources.chain.cache

false

如果你不希望设置属性的默认值,你可以在你的application.yml中把spring.devtools.add-properties 设置为false。

在开发Spring MVC和Spring WebFlux应用程序时,你可能需要更多关于Web请求的信息,开发者工具建议你为Web日志组启用DEBUG日志。这将给你提供客户端的请求信息,哪个handler正在处理它,响应结果,以及其他细节。如果你希望记录所有的请求细节,可以打开【spring.mvc.log-request-details[]】 或 【spring.codec.log-request-details[]】 配置。

3. 自动重启

使用spring-boot-devtools的应用程序会在classpath上的文件发生变化时自动重启。当在IDE中工作时,这可能是一个有用的功能,因为它为代码变化提供了一个非常快速的反馈。默认情况下,classpath上任何指向目录的条目都会被检测到变化。注意,某些资源,如静态资源和视图模板发生变化时,不需要重启应用程序。

触发重启

由于DevTools监控classpath资源,触发重启的唯一方法时更新classpath。无论你使用的是IDE还是构建插件,被修改的文件都必须被重新编译以触发重启。导致更新classpath的方式取决于你所使用的工具。

  • 在Eclipse中,保存一个修改过的文件会导致classpath被更新并触发重启。
  • 在InteliJ IDEA中,构建项目(Build  → Build Project)有同样的效果。
  • 如果使用构建插件,运行Maven的【mvn compile】会触发重启。

重启 vs 重载

Spring boot通过两个类加载器实现了重启。不变的类(例如,来自第三方jar的类)被加载到一个base classloader。你正在开发的类被加载到 restart classloaderr中。当应用程序被重新启动时,restart classloader被丢弃,并被创建一个新的。这种方法以为着应用程序的重启通常比“冷启动”快得多,因为base classloader已经可用并被填充。

如果你发现重启对你的应用程序来说不够快,或者你遇到了类加载相关问题,你可以考虑重载技术,工作原理是在类被加载时对其进行重写,使其更容易重载。

3.1 记录条件评估的变化

默认情况下,每次你的应用程序重新启动时,都会记录一份显示条件评估delta的报告。该报告显示了你的应用程序的自动配置的变化,因为你做了一些改变,如添加或删除Bean和设置配置属性。

要禁用报告的记录,请设置一下属性yaml

spring:
  devtools:
    restart:
      log-condition-evaluation-delta: false

3.2 排除资源

某些资源在被改变时不一定需要触发重启。例如,thymeleaf模板可以就地编辑。默认情况下,改变/META-INF/maven, /META-INF/resources, /resources, /static, /public, /templates中资源不会触发重启,但会触发实时重载。如果你想自定义这些排除项,可以使用spring.devtools.restart.exclude属性。例如,要只排除 /static 和 /public,你可以设置一下属性。

yaml

spring:
  devtools:
    restart:
      exclude: "static/**,public/**"

3.3 监控额外的路径

当你不在classpath上的文件进行修改时,你可能希望你的应用程序被重新启动或重新加载。为此,使用【spring.devtools.restart.extra-paths】属性来配置监控变化的额外路径。你可以使用【spring.devtools.restart.excelude】属性来控制额外路径下的变化时触发完全重启还是实时加载。

3.4 禁止重启

如果你不想使用重启功能,你可以通过使用spring.devtools.restart.enabled属性来禁用它。在大多数情况下,你可以在application,yaml中设置这个属性。

如果你需要完全禁用重启支持,你需要在调用SpringApplication.run(...)之前将spring.devtools.restart.enabled属性设置为false。如下面的例子

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        System.setProperty("spring.devtools.restart.enabled", "false");
        SpringApplication.run(MyApplication.class, args);
    }

}

3.5 使用trigger file

如果你只想在特定时间触发重启,你可以【trigger file】,这是一个特殊的文件,当你想实际触发重启检查时,那你就对这个文件进行修改。

对文件的任何更新都会触发检查,但只有当devtools检测到它有变动发生时,才会实际重新启动。

通过属性【spring.devtools.restart.trigger-file】设置trigger file文件的名称(不包括任何路径)。trigger file 必须在classpath路径上。

src
+- main
   +- resources
      +- .reloadtrigger

那么你的【trigger-file】属性应该设置为如下

spring:
  devtools:
    restart:
      trigger-file: ".reloadtrigger"

现在只有当 src/main/resources/.reloadtrigger 被更新时才会重新启动。

有些IDE有一些功能,使你不需要手动更新你的触发器文件。Spring Tools for Eclipse和InteliJ IDEA 都有这种支持。对于Spring Tools,你可以使用控制台视图中的reload按钮(需要把你的trigger-file命名为.reloadtrigger)。对于InterliJ IDEA,你可以按照其文档中的说明进行操作。

3.6 自定义重启类加载器

正如前面在Restart vs Reload所描述的,重启功能时通过使用两个classloader实现的。如果这导致了其他的问题,你可能徐娅自定义类加载器。

默认情况下,你的IDE中任何打开的项目都是用“restart”类记载器加载的,而任何常规的.jar 文件都是用 base 类加载器加载。如果你使用【mvn spring-boot:run】或【gradle bootRun】也是一样,包含了@SpringBootApplication的项目用 restart 类加载器加载,其他都用 base 类加载器。

你可以通过创建 META-INF/spring-devtools.properties 文件来指定 Spring Boot 用不同的类加载器来加载你的项目的不同部分。【spring-devtools.properties】文件可以包含以 restart.exclude 和 restart.include 开通的属性。 include元素是应该被拉大 restart 类夹在其中的项目,而exclude元素是应该被推到base类加载器中的项目。该属性的值是一个基于classpath的正则表达式,如以下

restart:
  exclude:
    companycommonlibs: "/mycorp-common-[\\w\\d-\\.]+\\.jar"
  include:
    projectcommon: "/mycorp-myproj-[\\w\\d-\\.]+\\.jar"

4. 全局设置

你可以通过在 $HOME/.config/spring-boot 目录下添加以下文件来配置全局的devtools设置。

  • spring-boot-devtools.propertiese
  • spring-boot-devtools.yaml
  • spring-boot-devtools.yml

添加到这些文件中的任何属性都适用于你机器上使用devtools的所有Spring Boot应用程序。例如,如果要将重启配置为总是使用trigger file,你可以在spring-boot-devtools文件中添加以下属性。

spring:
  devtools:
    restart:
      trigger-file: ".reloadtrigger"

5. 配置热部署

5.1 在pom.xml中添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>

5.2 添加配置信息

#开启热部署
spring.devtools.restart.enabled=true
#热部署重新加载java下面类文件
spring.devtools.restart.additional-paths=src/main/java
#排除静态文件重新部署
spring.devtools.restart.exclude=static/**

5.3 配置setting页面

5.4 Ctrl+Shift+Alt+/

  • 21
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光岳楼观景

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值