开发者工具

Spring Boot 包含了一套额外的工具,可以让应用开发体验更加愉快。 这Spring-boot-devtools模块可以包含在任何项目中,以提供额外的开发阶段功能。 为了支持开发工具,请在你的构建中添加模块依赖,如下 Maven 和 Gradle 的列表所示:spring-doc.cadn.net.cn

梅文
<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-devtools</artifactId>
		<optional>true</optional>
	</dependency>
</dependencies>
格拉德勒
dependencies {
	developmentOnly("org.springframework.boot:spring-boot-devtools")
}
开发工具可能会引发类加载问题,尤其是在多模块项目中。《诊断 Classloading Issues》解释了如何诊断和解决它们。
当运行完整打包的应用程序时,开发者工具会自动被禁用。 如果您的应用是从Java -jar或者如果它是从特殊的类加载器启动的,则被视为“生产应用程序”。 你可以通过使用spring.devtools.restart.enabled系统属性。 要启用开发工具,无论用什么类加载器启动你的应用程序,都设置-Dspring.devtools.restart.enabled=true系统属性。 这绝不能在运行开发工具存在安全风险的生产环境中进行。 要禁用开发工具,排除依赖或设置-Dspring.devtools.restart.enabled=false系统属性。
在 Maven 中将依赖标记为可选,或者使用仅开发Gradle 中的配置(如上所示)防止开发工具被传递应用到使用你项目的其他模块。
重新打包的压缩包默认不包含开发工具。 如果你想使用某个远程开发工具功能,就必须包含它。 使用 Maven 插件时,设置exclusionDevtools属性到false. 使用Gradle插件时,配置任务的类路径以包含仅开发配置.

诊断类加载问题

Restart与Reload部分所述,重启功能通过使用两个类加载器实现。 对于大多数应用,这种方法效果良好。 然而,有时它会导致类加载问题,尤其是在多模块项目中。spring-doc.cadn.net.cn

要诊断 classloading 问题是否真的是由 devtools 及其两个 classloader 引起的,可以尝试禁用重启。 如果这样解决了你的问题,可以自定义重启 classloader,把整个项目都包含进去。spring-doc.cadn.net.cn

财产违约

Spring Boot 支持的几个库使用缓存来提升性能。 例如,模板引擎缓存已编译的模板以避免反复解析模板文件。 此外,Spring MVC 可以在为静态资源提供响应时添加 HTTP 缓存头部。spring-doc.cadn.net.cn

虽然缓存在生产环境中非常有益,但在开发过程中可能会适得其反,导致你无法看到应用中刚刚做的更改。 因此,spring-boot-devtools 默认会禁用缓存选项。spring-doc.cadn.net.cn

缓存选项通常通过你的设置来配置application.properties文件。 例如,Thymeleaf提供Spring.百里香叶.缓存财产。spring-doc.cadn.net.cn

同样的情况也适用于设置为100%的追踪概率,因为默认情况下可能不会记录所有用于测试的痕迹。spring-doc.cadn.net.cn

与其手动设置这些属性,不如Spring-boot-devtools模块会自动应用合理的开发时间配置。spring-doc.cadn.net.cn

下表列出了所有应用的属性:spring-doc.cadn.net.cn

名称 默认值

管理。追踪。抽样。概率spring-doc.cadn.net.cn

1.0spring-doc.cadn.net.cn

server.servlet.jsp.init-parameters.developmentspring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

server.servlet.session.persistentspring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

spring.docker.compose.readiness.waitspring-doc.cadn.net.cn

只有当开始时spring-doc.cadn.net.cn

spring.freemarker.cachespring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

spring.graphql.graphiql.enabledspring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

春.groovy.模板.缓存spring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

spring.h2.console.enabledspring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

spring.mustache.servlet.cachespring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

spring.mvc.log-解决异常spring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

Spring.反应堆.netty.关闭-静止-期spring-doc.cadn.net.cn

0spring-doc.cadn.net.cn

spring.template.provider.cachespring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

Spring.百里香叶.缓存spring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

spring.web.error.include-binding-errorsspring-doc.cadn.net.cn

总是spring-doc.cadn.net.cn

spring.web.error.include-messagespring-doc.cadn.net.cn

总是spring-doc.cadn.net.cn

Spring.web.error.include-stacktracespring-doc.cadn.net.cn

总是spring-doc.cadn.net.cn

spring.web.resources.cache.periodspring-doc.cadn.net.cn

0spring-doc.cadn.net.cn

spring.web.resources.chain.cachespring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

如果你不想应用属性默认值,可以设置spring.devtools.add-properties(Springfalse在你的application.properties.

由于在开发 Spring MVC 和 Spring WebFlux 应用时需要更多关于网页请求的信息,开发者工具建议你启用调试WebLogging组。 这会告诉你关于收到请求的信息、处理请求的处理器、响应结果以及其他细节。 如果你想记录所有请求细节(包括可能敏感的信息),你可以开启spring.mvc.log-请求-详情spring.http.codecs.log-请求-详情配置属性。spring-doc.cadn.net.cn

自动重启

使用Spring-boot-devtools每当类路径上的文件发生变化时,会自动重启。 这在 IDE 工作时非常有用,因为它为代码变更提供了非常快速的反馈循环。 默认情况下,类路径中指向目录的任何条目都会被监控。 请注意,某些资源,如静态资产和视图模板,无需重启应用程序spring-doc.cadn.net.cn

触发重启

由于 DevTools 监控类路径资源,触发重启的唯一方法是更新类路径。 无论你用的是IDE还是构建插件,修改过的文件都必须重新编译才能触发重启。 你如何更新类路径取决于你使用的工具:spring-doc.cadn.net.cn

  • 在 Eclipse 中,保存修改过的文件会导致类路径更新并触发重启。spring-doc.cadn.net.cn

  • 在 IntelliJ IDEA 中,构建项目(建造 ->建造项目)具有相同的效果。spring-doc.cadn.net.cn

  • 如果使用构建插件,运行时MVN 编译对于梅文,或者Gradle构建因为Gradle会触发重启。spring-doc.cadn.net.cn

如果你用 Maven 或 Gradle 的构建插件重启,必须保留分 叉设置为启用. 如果你禁用分叉,开发工具中使用的隔离应用类加载器将不会被创建,重启也无法正常工作。
自动重启配合LiveReload效果非常好。 详情请参见LiveReload部分。 如果你用JRebel,自动重启会被禁用,取而代之的是动态类重新加载。 其他开发工具功能(如LiveReload和属性覆盖)仍然可以使用。
DevTools 依赖应用上下文的关机钩子在重启时关闭该接口。 如果你禁用了关机钩,它就无法正常工作了 (SpringApplication.setRegisterShutdownHook(false)).
开发工具需要定制ResourceLoader被以下机构使用应用上下文. 如果你的申请已经提供了,那它就会被包装。 直接覆盖获取资源方法应用上下文不支持。
使用 AspectJ 织入时不支持自动重启。
重启与重新装填

Spring Boot提供的重启技术通过使用两个类加载器来实现。 不变的类(例如来自第三方 jar 的类)会加载到基础类加载器中。 你正在开发的类会被加载到restart classloader中。 当应用程序重启时,重类加载器会被丢弃,重新创建一个新的。 这种方法意味着应用重启通常比“冷启动”快得多,因为基础类加载器已经可用并被填充。spring-doc.cadn.net.cn

如果你发现重启对你的应用来说不够快,或者遇到类加载问题,可以考虑像ZeroTurnaround的JRebel这样的重载技术。 这些方法通过在加载时重写类,使其更易于重新加载。spring-doc.cadn.net.cn

状态评估中的日志变化

默认情况下,每次应用重启时,都会记录显示状态评估差异的报告。 报告显示了你在添加或移除豆子和设置配置属性等更改时,应用程序自动配置的变化。spring-doc.cadn.net.cn

要禁用报告的日志,请设置以下属性:spring-doc.cadn.net.cn

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

排除资源

某些资源在更改时不一定需要触发重启。 例如,Thymeleaf 模板可以在原地编辑。 默认情况下,在 中更改资源/元步兵/专家,/元补强/资源,/资源,/静态的,/公共/模板不会触发重启,但会触发一次实时装填。 如果你想自定义这些排除项,可以使用Spring.devtools.restart.exclude财产。 例如,只排除/静态的/公共你将设置以下属性:spring-doc.cadn.net.cn

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-doc.cadn.net.cn

禁用重启

如果你不想使用重启功能,可以通过以下方式禁用它spring.devtools.restart.enabled财产。 在大多数情况下,你可以将该属性设置在你的application.properties(如此仍会初始化重启类加载器,但不会监控文件变更。)spring-doc.cadn.net.cn

如果你需要完全禁用重启支持(例如,因为它不支持某个特定库),你需要设置spring.devtools.restart.enabled 系统属性到false在呼唤之前SpringApplication.run(...)如下例所示:spring-doc.cadn.net.cn

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

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

@SpringBootApplication
object MyApplication {

	@JvmStatic
	fun main(args: Array<String>) {
		System.setProperty("spring.devtools.restart.enabled", "false")
		SpringApplication.run(MyApplication::class.java, *args)
	}

}

使用触发文件

如果你使用的是持续编译更改文件的IDE,你可能更倾向于只在特定时间触发重启。 为此,您可以使用“触发文件”,这是一个特殊文件,当你想真正触发重启检查时必须修改它。spring-doc.cadn.net.cn

任何文件更新都会触发检查,但只有当Devtools检测到重启有相关内容时才会真正启动。

要使用触发文件,设置spring.devtools.restart.trigger-file属性是触发文件的名称(不包括任何路径)。 触发文件必须出现在你的类路径上某个位置。spring-doc.cadn.net.cn

例如,如果你有一个结构如下的项目:spring-doc.cadn.net.cn

src
+- main
   +- resources
      +- .reloadtrigger

然后你触发文件属性为:spring-doc.cadn.net.cn

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

现在只有在src/main/resources/.reloadtrigger已更新。spring-doc.cadn.net.cn

你可能想设置一下spring.devtools.restart.trigger-file作为一个全局设置,这样你所有的项目都能以相同方式表现。

有些IDE有功能,可以省去手动更新触发文件。Eclipse 的 Spring ToolsIntelliJ IDEA(终极版)都有这样的支持。 用Spring Tools,你可以在控制台视图里按“重新加载”按钮(只要你触发文件被命名为.reloadtrigger). 对于IntelliJ IDEA,你可以按照他们文档中的说明作。spring-doc.cadn.net.cn

自定义重启类加载器

如前述“重启与重载”部分所述,重启功能通过使用两个类加载器实现。 如果这导致了问题,你可以用spring.devtools.restart.enabled系统属性,如果应用关闭重启后能用,你可能需要自定义哪个 classloader 加载的内容。spring-doc.cadn.net.cn

默认情况下,IDE中任何打开的项目都会加载“重启”类加载器,以及任何普通项目。罐文件被加载为“基础”类加载程序。 如果你用MVN Spring-boot:rungradle bootRun:包含你的项目@SpringBootApplication加载了“重启”类加载器,其他所有内容都装载了“基础”类加载器。 当你启动应用时,类路径会印在控制台上,这有助于识别任何有问题的条目。 用于反射性的类,尤其是注释,可以在启动时加载到父类加载器(固定类)中,先于使用它们的应用类,这可能导致 Spring 在应用程序中无法检测到它们。spring-doc.cadn.net.cn

你可以通过创建一个META-INF/spring-devtools.properties文件。 这Spring-devtools.properties文件可以包含前缀为restart.excluderestart.include. 这包括元素是应当被拉入“重启”类加载器的项目,并且排除元素是应推入“基础”类加载器的项目。 该属性的值是一个正则表达式模式,应用于启动时传递给JVM的类路径。 这里有一个示例,部分本地类文件被排除,而在重启类加载器中包含了一些额外的库:spring-doc.cadn.net.cn

restart:
  exclude:
    companycommonlibs: "/mycorp-common-[\\w\\d-\\.]/(build|bin|out|target)/"
  include:
    projectcommon: "/mycorp-myproj-[\\w\\d-\\.]+\\.jar"
所有属性键必须是唯一的。 只要一个性产以restart.include。restart.exclude。这是考虑的。
META-INF/spring-devtools.properties从类路径加载。 你可以在项目内部打包文件,或者在项目使用的库中打包文件。 系统属性不能使用,只能使用属性文件。

已知的局限性

重启功能对于使用标准反序列化的对象来说效果不佳ObjectInputStream. 如果你需要反序列化数据,可能需要使用 Spring 的ConfigurableObjectInputStreamThread.currentThread().getContextClassLoader().spring-doc.cadn.net.cn

不幸的是,一些第三方库在反序列化时未考虑上下文类加载器。 如果发现了这样的问题,你需要向原作者申请修复。spring-doc.cadn.net.cn

LiveReload

Spring-boot-devtools模块包含一个嵌入式的LiveReload服务器,可用于在资源变更时触发浏览器刷新。 LiveReload浏览器扩展免费适用于Chrome、Firefox和Safari。 你可以通过在你选择的浏览器的市场或商店搜索“LiveReload”来找到这些扩展。spring-doc.cadn.net.cn

如果你想在应用运行时启动LiveReload服务器,可以设置spring.devtools.livereload.enabled属性到true.spring-doc.cadn.net.cn

你一次只能运行一个LiveReload服务器。 启动应用前,确保没有其他LiveReload服务器在运行。 如果你从 IDE 启动多个应用程序,只有第一个支持LiveReload。
要在文件发生变化时触发LiveReload,必须启用自动重启

全局设置

你可以通过添加以下任一文件来配置全局开发者工具的设置$HOME/.config/spring-boot目录:spring-doc.cadn.net.cn

  1. Spring-boot-DevTools.propertiesspring-doc.cadn.net.cn

  2. Spring-boot-DevTools.yamlspring-doc.cadn.net.cn

  3. spring-boot-devtools.ymlspring-doc.cadn.net.cn

添加到这些文件上的任何属性都适用于你机器上所有使用 devtools 的 Spring Boot 应用程序。 例如,要配置restart始终使用触发文件,你可以在你的Spring-boot-devtools文件:spring-doc.cadn.net.cn

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

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

如果 devtools 配置文件在$HOME/.config/spring-boot,是 的根$HOME在目录中搜索是否存在.spring-boot-devtools.properties文件。 这允许你与使用旧版 Spring Boot 但不支持$HOME/.config/spring-boot位置。

开发工具的属性/yaml文件不支持配置文件。spring-doc.cadn.net.cn

任何激活的配置文件.spring-boot-devtools.properties不会影响配置文件特定配置文件的加载。 配置文件特定文件名(形式为Spring-boot-DevTools-<profile>.propertiesspring.config.activate.on-profileYAML 和 Properties 文件中的文档均不支持。spring-doc.cadn.net.cn

配置文件系统观察者的配置

文件系统观察者它通过轮询特定时间区间的类变更,然后等待预设的安静期以确保没有更多变化。 由于 Spring Boot 完全依赖 IDE 编译并复制文件到其读取位置,你可能会发现某些更改在 devtools 重启应用时没有被反映。 如果你经常遇到这样的问题,试着提高spring.devtools.restart.poll-intervalspring.devtools.restart.quiet-period适合你开发环境的参数参数:spring-doc.cadn.net.cn

spring.devtools.restart.poll-interval=2s
spring.devtools.restart.quiet-period=1s
spring:
  devtools:
    restart:
      poll-interval: "2s"
      quiet-period: "1s"

监控的类路径目录现在每2秒轮询一次以获取变化,并保持1秒的静默期以确保没有额外的类别更改。spring-doc.cadn.net.cn

远程应用

Spring Boot 开发工具并不限于本地开发。 远程运行应用时,你还可以使用多种功能。 远程支持是自愿支持的,因为启用可能存在安全风险。 只有在可信网络上运行或使用 SSL 保护时才应启用。 如果这两个选项都不可用,就不要使用DevTools的远程支持。 你绝不应该在生产部署时启用支持。spring-doc.cadn.net.cn

要启用它,你需要确保开发工具包含在重新包装的档案中,如下列表所示:spring-doc.cadn.net.cn

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
				<excludeDevtools>false</excludeDevtools>
			</configuration>
		</plugin>
	</plugins>
</build>

然后你需要设置Spring.DevTools.Remote.secret财产。 像任何重要的密码或秘密一样,数值应当独特且强大,无法被猜测或暴力破解。spring-doc.cadn.net.cn

远程开发工具支持分为两部分:一个是接受连接的服务器端端点,另一个是你在 IDE 中运行的客户端应用。 当Spring.DevTools.Remote.secret属性被设置。 客户端组件必须手动启动。spring-doc.cadn.net.cn

Spring WebFlux 应用程序不支持 Remote DevTools。

运行远程客户端应用

远程客户端应用设计为在你的IDE内部运行。 你得跑远程春应用使用与你连接的远程项目相同的类路径。 应用程序唯一需要的参数是它连接的远程 URL。spring-doc.cadn.net.cn

例如,如果你使用 Eclipse 或 Spring Tools,并且有一个名为我的应用如果你已经部署到 Cloud Foundry,你需要做以下作:spring-doc.cadn.net.cn

一个运行中的远程客户端可能如下列表:spring-doc.cadn.net.cn

  .   ____          _                                              __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _          ___               _      \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` |        | _ \___ _ __  ___| |_ ___ \ \ \ \
 \\/  ___)| |_)| | | | | || (_| []::::::[]   / -_) '  \/ _ \  _/ -_) ) ) ) )
  '  |____| .__|_| |_|_| |_\__, |        |_|_\___|_|_|_\___/\__\___|/ / / /
 =========|_|==============|___/===================================/_/_/_/
 :: Spring Boot Remote ::  (v4.0.0)

2025-11-20T16:37:24.633Z  INFO 128356 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Starting RemoteSpringApplication v4.0.0 using Java 25.0.1 with PID 128356 (/Users/myuser/.m2/repository/org/springframework/boot/spring-boot-devtools/4.0.0/spring-boot-devtools-4.0.0.jar started by myuser in /opt/apps/)
2025-11-20T16:37:24.637Z  INFO 128356 --- [           main] o.s.b.devtools.RemoteSpringApplication   : No active profile set, falling back to 1 default profile: "default"
2025-11-20T16:37:25.445Z  INFO 128356 --- [           main] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2025-11-20T16:37:25.538Z  INFO 128356 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Started RemoteSpringApplication in 2.05 seconds (process running for 3.205)
由于远程客户端使用与真实应用相同的类路径,它可以直接读取应用属性。 这是Spring.DevTools.Remote.secret属性被读取并传递给服务器进行认证。
建议始终使用这些https://作为连接协议,使流量被加密且密码无法被拦截。
如果你需要使用代理访问远程应用,可以配置Spring.devtools.remote.proxy.hostSpring.devtools.remote.proxy.port性能。

远程更新

远程客户端会像本地重启一样监控你的应用类路径变化。 任何更新的资源都会被推送到远程应用程序,并且(如有需要)会触发重启。 如果你在本地没有云服务的功能上迭代,这会很有帮助。 通常,远程更新和重启比完整的重建和部署周期要快得多。spring-doc.cadn.net.cn

在较慢的开发环境中,安静期可能不够,班级变更可能会被拆分成批次。 服务器在第一批职业更改上传后重启。 下一批文件无法发送给应用程序,因为服务器正在重启。spring-doc.cadn.net.cn

这通常通过警告表现为远程春应用记录了未能上传部分课程,以及随后的重试。 但这也可能导致应用代码不一致,以及在第一批更改上传后无法重启。 如果你经常遇到这样的问题,试着提高spring.devtools.restart.poll-intervalspring.devtools.restart.quiet-period参数以适应你的开发环境。 有关配置这些属性,请参见“配置文件系统观察者”部分。spring-doc.cadn.net.cn

文件只有在远程客户端运行时才会被监控。 如果你在启动远程客户端前更改文件,它不会被推送到远程服务器。