说明

https://docs.spring.io/spring-boot/docs/3.2.0/reference/htmlsingle/#using.devtools

Spring Boot包含了一套额外的工具,可以让应用程序开发体验更加愉快。spring-boot-devtools模块可以包含在任何项目中,以提供额外的开发时特性。要包含devtools支持,请将模块依赖添加到你的构建中。在Maven项目中如下所示:

org.springframework.boot

spring-boot-devtools

true

Gradle中如下所示:

dependencies {

developmentOnly("org.springframework.boot:spring-boot-devtools")

}

注意:devtools可能会引起类加载的问题,特别是在多模块项目中。

提示:开发工具在运行完全打包的应用程序时会自动禁用。如果你的应用程序是从java -jar启动的,或者它从一个特殊的类加载器启动,那么它被认为是“生产应用程序”。你可以使用spring.devtools.restart.enabled系统属性控制这种行为。要启用devtools,而不管拉起你的应用的类加载器,设置-Dspring.devtools.restart.enabled=true系统属性。

提示:在Maven中将依赖标记为可选或在Gradle中使用developmentOnly配置(如上所示)可以防止devtools被传递应用到使用你的项目的其它模块。

提示:重新打包的归档文件(jar或war)默认不包含devtools。如果你想使用某个远程devtools特性,你需要包含它。在使用Maven插件时,将excludeDevtools属性设置为false。

诊断类加载问题

重启功能是通过使用两个类加载器来实现的。对于大多数应用程序来说,这种方法工作得很好。然而,有时可能会导致类加载问题,特别是在多模块项目中。

要诊断类加载问题是否确实是由devtools及其两个类加载器引起的,可以尝试禁用重启。如果这解决了你的问题,你可以自定义重启类加载器以包含整个项目。

属性默认值

Spring Boot支持的库中有几个使用了缓存来提高性能。例如,模板引擎缓存已编译的模板,以避免重复解析模板文件。另外,Spring MVC可以在为静态资源提供服务时向响应添加HTTP缓存头。

虽然缓存对于生产环境非常有益,但在开发过程中可能会产生相反的效果,导致你无法看到应用程序中刚刚做出的更改。因此,spring-boot-devtools默认禁用了缓存选项。

缓存选项通常通过application.properties文件中的设置进行配置。例如,Thymeleaf提供了spring.thymeleaf.cache属性。spring-boot-devtools模块会自动应用合理的开发时配置,而无需手动设置这些属性。 以下表格列出了所有应用的属性:

注意:如果你不想应用属性默认值,可以在application.properties中设置spring.devtools.add-properties为false。

由于在开发Spring MVC和Spring WebFlux应用程序时,你需要更多关于Web请求的信息,开发者工具建议你为web日志组启用DEBUG日志记录。这将提供有关传入的请求、正在处理它的处理器、响应结果的信息和其它详细信息。如果你希望记录所有请求的详细信息(包括潜在的敏感信息),你可以启用spring.mvc.log-request-details或spring.codec.log-request-details配置属性。

自动重启

使用spring-boot-devtools的应用程序在类路径上的文件发生变化时会自动重新启动。这在IDE中工作时是一个有用的功能,因为它为代码更改提供了非常快的反馈循环。默认情况下,监视类路径上指向目录的任何条目以检查更改。请注意,某些资源(如静态资产和视图模板)不需要重新启动应用程序。

触发重新启动

由于DevTools监视类路径资源,触发重新启动的唯一方法是更新类路径。无论你使用的是IDE还是其中一个构建插件,修改过的文件都必须重新编译以触发重新启动。更新类路径的方式取决于你使用的工具:

在Eclipse中,保存修改后的文件会导致类路径更新并触发重新启动。在IntelliJ IDEA中,构建项目(Build +→+ Build Project)具有相同的效果。如果使用构建插件,对于Maven,运行mvn compile将触发重新启动;对于Gradle,运行gradle build将触发重新启动。

注意:如果你使用构建插件用Maven或Gradle进行重新启动,必须将forking设置为enabled。如果禁用forking,由devtools使用的隔离应用程序类加载器将不会被创建,并且重新启动将无法正常工作。

提示:自动重启与LiveReload配合使用时效果非常好。如果你使用JRebel,则禁用自动重启,而采用动态类重新加载。其他devtools功能(例如LiveReload和属性覆盖)仍可以使用。

注意:DevTools依赖于应用程序上下文的关闭钩子在重新启动期间关闭它。如果你禁用了关闭钩子,它将无法正常工作(SpringApplication.setRegisterShutdownHook(false))。

注意:DevTools需要自定义ApplicationContext使用的ResourceLoader。如果你的应用程序已经提供了一个,它将被包装。不支持直接覆盖ApplicationContext上的getResource方法。

注意:使用AspectJ编排时不支持自动重新启动。

Spring Boot提供的重新启动技术通过使用两个类加载器来实现。不变的类(例如,来自第三方jar的类)被加载到基础类加载器中。你正在活跃开发的类被加载到重新启动类加载器中。当应用程序重新启动时,重新启动类加载器被丢弃并创建一个新的。这种方法意味着应用程序重新启动通常比“冷启动”快得多,因为基础类加载器已经可用并已填充。 如果你发现重新启动对于你的应用程序不够快,或者遇到类加载问题,你可以考虑使用JRebel等重新加载技术。这些技术通过在加载时重写类来使它们更易于重新加载。

日志记录条件评估的差异

在默认情况下,每次应用程序重新启动时,都会记录条件评估的差异报告。报告会显示应用程序自动配置的变化,例如添加或删除beans以及设置配置属性等。 要禁用报告的记录,请设置以下属性:

spring.devtools.restart.log-condition-evaluation-delta=false

排除资源

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

spring.devtools.restart.exclude=static/**,public/**

提示:如果你想保留这些默认设置并添加其它排除项,可以使用属性spring.devtools.restart.additional-exclude。

监视其它路径

你可能希望更改不在类路径上的文件时,应用程序能够重新启动或重新加载。要实现这一点,请使用spring.devtools.restart.additional-paths属性配置要监视的其它路径。可以使用前面描述的spring.devtools.restart.exclude属性来控制其它路径下发生的更改是否触发完全重新启动或实时重新加载。

禁用重新启动

如果不想使用重新启动功能,可以通过使用spring.devtools.restart.enabled属性将其禁用。在大多数情况下,可以在application.properties中设置此属性(这样做仍然会初始化重新启动类加载器,但不会监视文件更改)。

如果需要完全禁用重新启动支持(例如,因为与特定库不兼容),要在调用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);

}

}

使用一个触发文件

如果你使用的是持续编译更改文件的IDE,可能更希望仅在特定时间触发重新启动。要实现这一点,可以使用“触发文件”。这是一个特殊文件,当实际触发重新启动检查时,必须修改它。 注意:对文件的任何更新都会触发检查,但只有当Devtools检测到它有事情可做时,才会实际发生重新启动。

要使用触发文件,请将spring.devtools.restart.trigger-file属性设置为触发文件的名称(不包括任何路径)。触发文件必须出现在类路径上的某个位置。 例如,如果你有一个具有以下结构的项目:

src

+- main

+- resources

+- .reloadtrigger

那么你的触发文件属性将是:

spring.devtools.restart.trigger-file=.reloadtrigger

提示:你可能希望将spring.devtools.restart.trigger-file设置为全局设置,以便你的所有项目都以相同的方式运行。

有些IDE具有自动更新触发文件的功能,从而省去了手动更新的需要。Spring Tools for Eclipse和IntelliJ IDEA(Ultimate Edition)都提供了这样的支持。使用Spring Tools时,你可以在控制台视图中使用“reload”按钮(只要你的触发文件命名为.reloadtrigger)。

自定义重新启动类加载器

重新启动功能是通过使用两个类加载器实现的。如果这导致问题,你可能需要自定义由哪个类加载器加载的内容。

默认情况下,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”类加载器的项。属性的值是应用于类路径的正则表达式模式,如下所示:

restart.exclude.companycommonlibs=/mycorp-common-[\\w\\d-\\.]+\\.jar

restart.include.projectcommon=/mycorp-myproj-[\\w\\d-\\.]+\\.jar

注意:所有属性键必须是唯一的。只要属性以restart.include.或restart.exclude.开头,它就会被考虑。

提示:类路径中的所有META-INF/spring-devtools.properties文件都会被加载。可以将文件打包在你的项目内部,或在项目所使用的库中。

已知的限制

重新启动功能与使用标准ObjectInputStream进行反序列化的对象一起工作时表现不佳。如果你需要反序列化数据,可能需要使用Spring的ConfigurableObjectInputStream,并将其与Thread.currentThread().getContextClassLoader()结合使用。

LiveReload

spring-boot-devtools模块包含一个嵌入式LiveReload服务器,可以在资源更改时触发浏览器刷新。LiveReload浏览器扩展程序可用于Chrome、Firefox和Safari,并可免费获取。你可以在所选浏览器的市场或商店中搜索“LiveReload”来找到这些扩展程序。

如果你不想在应用程序运行时启动LiveReload服务器,可以将spring.devtools.livereload.enabled属性设置为false。

注意:你一次只能运行一个LiveReload服务器。在启动应用程序之前,请确保没有其他LiveReload服务器正在运行。如果你从IDE启动多个应用程序,只有第一个应用程序具有LiveReload支持。

注意:要触发LiveReload以在文件更改时刷新浏览器,必须启用自动重启。

全局设置

你可以通过将以下任一文件添加到$HOME/.config/spring-boot目录中来配置全局devtools设置:

spring-boot-devtools.propertiesspring-boot-devtools.yamlspring-boot-devtools.yml

添加到这些文件中的任何属性都适用于你机器上使用devtools的所有Spring Boot应用程序。例如,要配置重启以始终使用一个触发器文件,你需要将以下属性添加到spring-boot-devtools文件中:

spring.devtools.restart.trigger-file=.reloadtrigger

默认情况下,$HOME 是用户的home目录。要自定义该位置,请设置 SPRING_DEVTOOLS_HOME 环境变量或 spring.devtools.home 系统属性。

注意:如果未在HOME/.config/spring−boot目录中找到devtools配置文件,则将在$HOME目录的根目录中搜索是否存在.spring-boot-devtools.properties文件。这允许你与旧版本的Spring Boot应用程序共享devtools全局配置,该旧版本不支持$HOME/.config/spring-boot位置。

配置文件系统监视器(File System Watcher)

FileSystemWatcher的工作方式是通过轮询来检查文件系统的更改,并在一定的时间间隔后等待一个预定义的静默期,以确保没有更多的更改。由于Spring Boot完全依赖于IDE来编译和复制文件到Spring Boot可以读取它们的位置,你可能会发现有时在devtools重启应用程序时,某些更改并没有反映出来。如果你经常观察到这类问题,请尝试将 spring.devtools.restart.poll-interval 和 spring.devtools.restart.quiet-period 参数增加到适合你开发环境的值:

spring.devtools.restart.poll-interval=2s

spring.devtools.restart.quiet-period=1s

被监视的类路径目录现在每2秒轮询一次以检查更改,并保持1秒的静默期以确保没有额外的类更改。

远程应用

Spring Boot 开发者工具不仅限于本地开发。当远程运行应用程序时,也可以使用许多功能。远程支持是可选的,因为启用它可能会带来安全风险。它只应在受信任的网络上运行或通过SSL进行保护时才启用。如果你没有这些选项中的任何一个,就不应使用DevTools的远程支持。绝不应该在生产部署中启用支持。

要启用Spring Boot的远程DevTools支持,需要确保devtools被包含在重新打包的归档文件中,如下所示:

org.springframework.boot

spring-boot-maven-plugin

false

接下来,需要设置spring.devtools.remote.secret属性。

远程devtools支持由两部分组成:一个服务器端端点,用于接受连接;以及一个客户端应用程序,你在IDE中运行它。当设置了spring.devtools.remote.secret属性时,服务器组件会自动启用。客户端组件必须手动启动。 注意:远程devtools不支持Spring WebFlux应用程序。

运行远程客户端应用程序

远程客户端应用程序被设计成从你的集成开发环境(IDE)内部运行。你需要运行org.springframework.boot.devtools.RemoteSpringApplication,并且使用与所连接的远程项目相同的类路径(classpath)。该应用程序唯一必需的参数是它连接到的远程URL。

注意:由于远程客户端使用的是与真实应用程序相同的类路径,因此它可以直接读取应用程序的属性。这就是spring.devtools.remote.secret属性如何被读取并传递给服务器进行身份验证的方式。

提示:如果你需要使用代理来访问远程应用程序,那么需要配置spring.devtools.remote.proxy.host和spring.devtools.remote.proxy.port属性。

远程更新

远程客户端以与本地重启相同的方式监视应用程序类路径中的更改。任何更新的资源都会被推送到远程应用程序,并且(如果需要)触发重启。当你在某个功能上进行迭代,而该功能使用了本地没有的云服务时,这会非常有用。

注意:文件只有在远程客户端运行时才会被监视。如果在启动远程客户端之前更改了文件,那么这些更改不会被推送到远程服务器。

参考文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。