对于最新的稳定版本,请使用 Spring Boot 3.4.0spring-doc.cn

开发人员工具

Spring Boot 包含一组额外的工具,这些工具可以使应用程序开发体验更加愉快。 该模块可以包含在任何项目中,以提供其他开发时功能。 要包含 devtools 支持,请将模块依赖项添加到您的构建中,如以下 Maven 和 Gradle 清单所示:spring-boot-devtoolsspring-doc.cn

Maven 系列
<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-devtools</artifactId>
		<optional>true</optional>
	</dependency>
</dependencies>
Gradle
dependencies {
	developmentOnly("org.springframework.boot:spring-boot-devtools")
}
Devtools 可能会导致类加载问题,尤其是在多模块项目中。诊断类加载问题 介绍了如何诊断和解决这些问题。
在运行完全打包的应用程序时,会自动禁用开发人员工具。 如果您的应用程序是从特殊类加载器启动的,或者它是从特殊类加载器启动的,则它被视为“生产应用程序”。 您可以使用 system 属性控制此行为。 要启用 devtools,而不考虑用于启动应用程序的类加载器,请设置 system 属性。 在运行 devtools 存在安全风险的生产环境中,不得执行此操作。 要禁用 devtools,请排除依赖项或设置 system 属性。java -jarspring.devtools.restart.enabled-Dspring.devtools.restart.enabled=true-Dspring.devtools.restart.enabled=false
在 Maven 中将依赖项标记为可选或在 Gradle 中使用配置(如上所示)可以防止 devtools 被传递到使用您项目的其他模块。developmentOnly
默认情况下,重新打包的存档不包含 devtools。 如果你想使用某个远程 devtools 功能,你需要包含它。 使用 Maven 插件时,请将属性设置为 。 使用 Gradle 插件时,请配置任务的 Classpath 以包含 developmentOnly 配置excludeDevtoolsfalse

诊断类加载问题

Restart vs Reload 部分所述,重新启动功能是使用两个类加载器实现的。 对于大多数应用程序,此方法效果很好。 但是,它有时会导致类加载问题,尤其是在多模块项目中。spring-doc.cn

要诊断类加载问题是否确实是由 devtools 及其两个类加载器引起的,请尝试禁用 restart。 如果这解决了您的问题,请自定义重新启动类加载器以包含整个项目。spring-doc.cn

属性默认值

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

虽然缓存在生产中非常有益,但在开发过程中可能会适得其反,阻止您看到刚刚在应用程序中所做的更改。 因此,spring-boot-devtools默认禁用缓存选项。spring-doc.cn

缓存选项通常由文件中的设置配置。 例如,Thymeleaf 提供了 property 。 无需手动设置这些属性,该模块会自动应用合理的开发时配置。application.propertiesspring.thymeleaf.cachespring-boot-devtoolsspring-doc.cn

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

名字 默认值

server.error.include-binding-errorsspring-doc.cn

alwaysspring-doc.cn

server.error.include-messagespring-doc.cn

alwaysspring-doc.cn

server.error.include-stacktracespring-doc.cn

alwaysspring-doc.cn

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

truespring-doc.cn

server.servlet.session.persistentspring-doc.cn

truespring-doc.cn

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

only-if-startedspring-doc.cn

spring.freemarker.cachespring-doc.cn

falsespring-doc.cn

spring.graphql.graphiql.enabledspring-doc.cn

truespring-doc.cn

spring.groovy.template.cachespring-doc.cn

falsespring-doc.cn

spring.h2.console.enabledspring-doc.cn

truespring-doc.cn

spring.mustache.servlet.cachespring-doc.cn

falsespring-doc.cn

spring.mvc.log-resolved-exceptionspring-doc.cn

truespring-doc.cn

spring.reactor.netty.shutdown-quiet-periodspring-doc.cn

0sspring-doc.cn

spring.template.provider.cachespring-doc.cn

falsespring-doc.cn

spring.thymeleaf.cachespring-doc.cn

falsespring-doc.cn

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

0spring-doc.cn

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

falsespring-doc.cn

如果不希望应用属性默认值,则可以在 .spring.devtools.add-propertiesfalseapplication.properties

由于在开发 Spring MVC 和 Spring WebFlux 应用程序时需要有关 Web 请求的更多信息,因此开发人员工具建议您为日志记录组启用日志记录。 这将为您提供有关传入请求、哪个处理程序正在处理该请求、响应结果和其他详细信息的信息。 如果您希望记录所有请求详细信息(包括潜在的敏感信息),则可以打开 or 配置属性。DEBUGwebspring.mvc.log-request-detailsspring.codec.log-request-detailsspring-doc.cn

自动重启

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

触发重启

当 DevTools 监控 Classpath 资源时,触发重启的唯一方法是更新 Classpath。 无论您使用的是 IDE 还是其中一个构建插件,都必须重新编译修改后的文件以触发重启。 更新 Classpath 的方式取决于您使用的工具:spring-doc.cn

  • 在 Eclipse 中,保存修改后的文件会导致 Classpath 更新并触发重新启动。spring-doc.cn

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

  • 如果使用构建插件,则为 Maven 或 Gradle 运行将触发重启。mvn compilegradle buildspring-doc.cn

如果要使用构建插件通过 Maven 或 Gradle 重新启动,则必须将设置保留为 。 如果禁用 forking,则不会创建 devtools 使用的隔离应用程序类加载器,并且重启将无法正常运行。forkingenabled
与 LiveReload 一起使用时,自动重启效果非常好。 有关详细信息,请参阅 LiveReload 部分。 如果使用 JRebel,则禁用自动重启,以支持动态类重新加载。 其他 devtools 功能(例如 LiveReload 和属性覆盖)仍然可以使用。
DevTools 依赖于应用程序上下文的 shutdown 钩子在重启期间关闭它。 如果你禁用了 shutdown hook (),它就无法正常工作。SpringApplication.setRegisterShutdownHook(false)
DevTools 需要自定义 ApplicationContext 使用的 ResourceLoader。 如果您的应用程序已经提供了一个,那么它将被包装。 不支持在 ApplicationContext 上直接覆盖该方法。getResource
使用 AspectJ 编织时不支持自动重启。
重启 vs 重新加载

Spring Boot 提供的重启技术通过使用两个类加载器来工作。 不更改的类(例如,来自第三方 jar 的类)将加载到类加载器中。 您正在积极开发的类将加载到重新启动类加载器中。 重新启动应用程序时,将丢弃重新启动类加载器,并创建一个新的类加载器。 这种方法意味着应用程序重启通常比 “冷启动” 快得多,因为类加载器已经可用并已填充。spring-doc.cn

如果您发现重新启动对于您的应用程序来说不够快,或者您遇到了类加载问题,您可以考虑从 ZeroTurnaround 重新加载 JRebel 等技术。 这些通过在加载时重写类来使它们更适合重新加载。spring-doc.cn

在条件评估中记录变化

默认情况下,每次应用程序重新启动时,都会记录一个显示条件评估增量的报告。 该报告显示在您进行更改(例如添加或删除 Bean 以及设置配置属性)时对应用程序的自动配置的更改。spring-doc.cn

要禁用报表的日志记录,请设置以下属性:spring-doc.cn

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

排除资源

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

spring.devtools.restart.exclude=static/**,public/**
spring:
  devtools:
    restart:
      exclude: "static/**,public/**"
如果要保留这些默认值并添加其他排除项,请改用该属性。spring.devtools.restart.additional-exclude

监视其他路径

您可能希望在更改不在 Classpath 上的文件时重新启动或重新加载应用程序。 为此,请使用该属性配置其他路径以监视更改。 您可以使用前面描述的属性来控制其他路径下的更改是触发完全重新启动还是实时重新加载spring.devtools.restart.additional-pathsspring.devtools.restart.excludespring-doc.cn

禁用重启

如果不想使用重新启动功能,可以使用属性 . 在大多数情况下,你可以在你的 (这样做仍然会初始化重启 classloader,但它不会监视文件更改)。spring.devtools.restart.enabledapplication.propertiesspring-doc.cn

如果需要完全禁用重新启动支持(例如,因为它不适用于特定库),则需要将 System 属性设置为 before calling ,如以下示例所示:spring.devtools.restart.enabledfalseSpringApplication.run(…​)spring-doc.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)
	}

}

使用 Trigger 文件

如果使用持续编译更改文件的 IDE,则可能更愿意仅在特定时间触发重启。 为此,您可以使用 “trigger file”,这是一个特殊文件,当您想要实际触发重启检查时必须对其进行修改。spring-doc.cn

对文件的任何更新都会触发检查,但只有在 Devtools 检测到它有事情要做时,才会真正发生重启。

要使用触发器文件,请将 property 设置为触发器文件的名称(不包括任何路径)。 触发器文件必须出现在 Classpath 上的某个位置。spring.devtools.restart.trigger-filespring-doc.cn

例如,如果您有一个具有以下结构的项目:spring-doc.cn

src
+- main
   +- resources
      +- .reloadtrigger

那么您的财产将是:trigger-filespring-doc.cn

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

现在,只有在 更新时才会重新启动。src/main/resources/.reloadtriggerspring-doc.cn

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

某些 IDE 具有无需手动更新触发器文件的功能。Spring Tools for EclipseIntelliJ IDEA(旗舰版)都有这样的支持。 使用 Spring Tools,您可以使用控制台视图中的 “reload” 按钮(只要您的 名称为 )。 对于 IntelliJ IDEA,您可以按照其文档中的说明进行操作。trigger-file.reloadtriggerspring-doc.cn

自定义 Restart Classloader

如前面的 Restart vs Reload 部分所述,重新启动功能是使用两个类加载器实现的。 如果这会导致问题,您可以使用 system 属性来诊断问题,如果应用程序在关闭 restart 的情况下工作,则可能需要自定义哪个类加载器加载的内容。spring.devtools.restart.enabledspring-doc.cn

默认情况下,IDE 中任何打开的项目都使用 “restart” 类加载器加载,任何常规文件都使用 “base” 类加载器加载。 如果使用 or ,情况也是如此:包含@SpringBootApplication的项目使用 “restart” 类加载器加载,其他所有内容都使用 “base” 类加载器加载。 当您启动应用程序时,类路径将打印在控制台上,这有助于识别任何有问题的条目。 反射式使用的类,尤其是 Comments,可以在启动时在使用它们的应用程序类之前加载到父(固定)类加载器中,这可能会导致应用程序中的 Spring 无法检测到它们。.jarmvn spring-boot:rungradle bootRunspring-doc.cn

你可以通过创建一个文件来指示 Spring Boot 使用不同的类加载器加载项目的各个部分。 该文件可以包含前缀为 和 的属性。 元素是应该被拉入 “restart” 类加载器中的项,元素是应该被下推到 “base” 类加载器中的项。 该属性的值是应用于启动时传递给 JVM 的 Classpath 的正则表达式模式。 下面是一个示例,其中排除了一些本地类文件,并且重新启动类加载器中包含了一些额外的库:META-INF/spring-devtools.propertiesspring-devtools.propertiesrestart.excluderestart.includeincludeexcludespring-doc.cn

restart:
  exclude:
    companycommonlibs: "/mycorp-common-[\\w\\d-\\.]/(build|bin|out|target)/"
  include:
    projectcommon: "/mycorp-myproj-[\\w\\d-\\.]+\\.jar"
所有属性键都必须是唯一的。 只要属性以 或 Consider 开头。restart.include.restart.exclude.
加载 Classpath 中的所有内容。 您可以将文件打包到项目内部,也可以打包到项目使用的库中。 系统属性不能使用,只能使用属性文件。META-INF/spring-devtools.properties

已知限制

重新启动功能不适用于使用标准 ObjectInputStream 反序列化的对象。 如果需要反序列化数据,则可能需要将 Spring 的 ConfigurableObjectInputStream 与 .Thread.currentThread().getContextClassLoader()spring-doc.cn

不幸的是,一些第三方库在没有考虑上下文类加载器的情况下进行反序列化。 如果您发现此类问题,则需要与原作者请求修复。spring-doc.cn

LiveReload

该模块包括一个嵌入式 LiveReload 服务器,该服务器可用于在更改资源时触发浏览器刷新。 LiveReload 浏览器扩展可免费用于 Chrome、Firefox 和 Safari。 您可以通过在所选浏览器的市场或商店中搜索“LiveReload”来找到这些扩展。spring-boot-devtoolsspring-doc.cn

如果不想在应用程序运行时启动 LiveReload 服务器,则可以将该属性设置为 。spring.devtools.livereload.enabledfalsespring-doc.cn

您一次只能运行一个 LiveReload 服务器。 在启动应用程序之前,请确保没有其他 LiveReload 服务器正在运行。 如果从 IDE 启动多个应用程序,则只有第一个应用程序支持 LiveReload。
要在文件更改时触发 LiveReload,必须启用 Automatic Restart

全局设置

您可以通过将以下任何文件添加到目录来配置全局 devtools 设置:$HOME/.config/spring-bootspring-doc.cn

  1. spring-boot-devtools.propertiesspring-doc.cn

  2. spring-boot-devtools.yamlspring-doc.cn

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

添加到这些文件的任何属性都适用于计算机上使用 devtools 的所有 Spring Boot 应用程序。 例如,要将 restart 配置为始终使用触发器文件,请将以下属性添加到文件中:spring-boot-devtoolsspring-doc.cn

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

默认情况下,是用户的主目录。 要自定义此位置,请设置环境变量或 system 属性。$HOMESPRING_DEVTOOLS_HOMEspring.devtools.homespring-doc.cn

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

devtools properties/yaml 文件中不支持配置文件。spring-doc.cn

激活的任何配置文件都不会影响特定于配置文件的配置文件的加载。 不支持 YAML 和 Properties 文件中的配置文件特定文件名(形式)和文档。.spring-boot-devtools.propertiesspring-boot-devtools-<profile>.propertiesspring.config.activate.on-profilespring-doc.cn

配置文件系统监控器

FileSystemWatcher 的工作原理是以一定的时间间隔轮询类更改,然后等待预定义的静默期以确保没有更多更改。 由于 Spring Boot 完全依赖于 IDE 来编译文件并将其复制到 Spring Boot 可以读取文件的位置,因此您可能会发现有时当 devtools 重新启动应用程序时,某些更改不会反映出来。 如果您经常观察到此类问题,请尝试将 and 参数增加到适合您的开发环境的值:spring.devtools.restart.poll-intervalspring.devtools.restart.quiet-periodspring-doc.cn

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

现在,每 2 秒轮询一次受监视的 Classpath 目录以查找更改,并保持 1 秒的静默期以确保没有其他类更改。spring-doc.cn

远程应用程序

Spring Boot 开发人员工具不仅限于本地开发。 在远程运行应用程序时,您还可以使用多项功能。 远程支持是可选的,因为启用远程支持可能会带来安全风险。 仅当在受信任的网络上运行时或使用 SSL 进行保护时,才应启用它。 如果这两个选项都不可用,则不应使用 DevTools 的远程支持。 您永远不应在生产部署中启用支持。spring-doc.cn

要启用它,您需要确保它包含在重新打包的存档中,如下面的清单所示:devtoolsspring-doc.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.secretspring-doc.cn

远程 devtools 支持分两部分提供:接受连接的服务器端终端节点和您在 IDE 中运行的客户端应用程序。 设置该属性时,将自动启用服务器组件。 必须手动启动 client 组件。spring.devtools.remote.secretspring-doc.cn

Spring WebFlux 应用程序不支持远程 devtools。

运行远程客户端应用程序

远程客户端应用程序设计为从 IDE 中运行。 你需要使用与你连接到的远程项目相同的 Classpath 来运行RemoteSpringApplication。 应用程序的单个必需参数是它连接到的远程 URL。spring-doc.cn

例如,如果您正在使用 Eclipse 或 Spring Tools,并且您有一个名为 Cloud Foundry 的项目,并且已将其部署到 Cloud Foundry,则可以执行以下操作:my-appspring-doc.cn

正在运行的远程客户端可能类似于以下清单:spring-doc.cn

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

2024-11-21T11:03:42.718Z  INFO 118222 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Starting RemoteSpringApplication v3.3.6 using Java 17.0.13 with PID 118222 (/Users/myuser/.m2/repository/org/springframework/boot/spring-boot-devtools/3.3.6/spring-boot-devtools-3.3.6.jar started by myuser in /opt/apps/)
2024-11-21T11:03:42.736Z  INFO 118222 --- [           main] o.s.b.devtools.RemoteSpringApplication   : No active profile set, falling back to 1 default profile: "default"
2024-11-21T11:03:43.329Z  INFO 118222 --- [           main] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2024-11-21T11:03:43.362Z  INFO 118222 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Started RemoteSpringApplication in 1.803 seconds (process running for 2.354)
因为远程客户端使用与真实应用程序相同的 Classpath,所以它可以直接读取应用程序属性。 这是读取属性并将其传递给服务器进行身份验证的方式。spring.devtools.remote.secret
始终建议用作连接协议,以便对流量进行加密并且无法拦截密码。https://
如果需要使用代理访问远程应用程序,请配置 and 属性。spring.devtools.remote.proxy.hostspring.devtools.remote.proxy.port

远程更新

远程客户端以与本地重启相同的方式监视应用程序 Classpath 的更改。 任何更新的资源都会推送到远程应用程序,并 (如果需要) 触发重启。 如果您迭代使用本地没有的云服务的功能,这可能会很有帮助。 通常,远程更新和重启比完整的重新生成和部署周期要快得多。spring-doc.cn

在较慢的开发环境中,可能会出现 Mand period 不够的情况,并且 classes 中的更改可能会被拆分为多个批次。 在上传第一批类更改后,服务器将重新启动。 无法将下一个批次发送到应用程序,因为服务器正在重新启动。spring-doc.cn

这通常表现为 RemoteSpringApplication 日志中有关无法上传某些类的警告,以及随后的重试。 但也可能导致应用程序代码不一致,以及在上传第一批更改后无法重新启动。 如果您经常观察到此类问题,请尝试将 and 参数增加到适合您的开发环境的值。 有关配置这些属性的信息,请参阅配置文件系统监控器部分。spring.devtools.restart.poll-intervalspring.devtools.restart.quiet-periodspring-doc.cn

仅当远程客户端运行时,文件才会受到监控。 如果在启动远程客户端之前更改文件,则不会将其推送到远程服务器。