开发者工具
Spring Boot 包含了一套额外的工具,可以让应用开发体验更加愉快。
这Spring-boot-devtools模块可以包含在任何项目中,以提供额外的开发阶段功能。
为了支持开发工具,请在你的构建中添加模块依赖,如下 Maven 和 Gradle 的列表所示:
<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部分所述,重启功能通过使用两个类加载器实现。 对于大多数应用,这种方法效果良好。 然而,有时它会导致类加载问题,尤其是在多模块项目中。
要诊断 classloading 问题是否真的是由 devtools 及其两个 classloader 引起的,可以尝试禁用重启。 如果这样解决了你的问题,可以自定义重启 classloader,把整个项目都包含进去。
财产违约
Spring Boot 支持的几个库使用缓存来提升性能。 例如,模板引擎缓存已编译的模板以避免反复解析模板文件。 此外,Spring MVC 可以在为静态资源提供响应时添加 HTTP 缓存头部。
虽然缓存在生产环境中非常有益,但在开发过程中可能会适得其反,导致你无法看到应用中刚刚做的更改。 因此,spring-boot-devtools 默认会禁用缓存选项。
缓存选项通常通过你的设置来配置application.properties文件。
例如,Thymeleaf提供Spring.百里香叶.缓存财产。
同样的情况也适用于设置为100%的追踪概率,因为默认情况下可能不会记录所有用于测试的痕迹。
与其手动设置这些属性,不如Spring-boot-devtools模块会自动应用合理的开发时间配置。
下表列出了所有应用的属性:
| 名称 | 默认值 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果你不想应用属性默认值,可以设置spring.devtools.add-properties(Spring自false在你的application.properties. |
由于在开发 Spring MVC 和 Spring WebFlux 应用时需要更多关于网页请求的信息,开发者工具建议你启用调试为WebLogging组。
这会告诉你关于收到请求的信息、处理请求的处理器、响应结果以及其他细节。
如果你想记录所有请求细节(包括可能敏感的信息),你可以开启spring.mvc.log-请求-详情或spring.http.codecs.log-请求-详情配置属性。
自动重启
使用Spring-boot-devtools每当类路径上的文件发生变化时,会自动重启。
这在 IDE 工作时非常有用,因为它为代码变更提供了非常快速的反馈循环。
默认情况下,类路径中指向目录的任何条目都会被监控。
请注意,某些资源,如静态资产和视图模板,无需重启应用程序。
如果你用 Maven 或 Gradle 的构建插件重启,必须保留分 叉设置为启用.
如果你禁用分叉,开发工具中使用的隔离应用类加载器将不会被创建,重启也无法正常工作。 |
| 自动重启配合LiveReload效果非常好。 详情请参见LiveReload部分。 如果你用JRebel,自动重启会被禁用,取而代之的是动态类重新加载。 其他开发工具功能(如LiveReload和属性覆盖)仍然可以使用。 |
DevTools 依赖应用上下文的关机钩子在重启时关闭该接口。
如果你禁用了关机钩,它就无法正常工作了 (SpringApplication.setRegisterShutdownHook(false)). |
开发工具需要定制ResourceLoader被以下机构使用应用上下文.
如果你的申请已经提供了,那它就会被包装。
直接覆盖获取资源方法应用上下文不支持。 |
| 使用 AspectJ 织入时不支持自动重启。 |
状态评估中的日志变化
默认情况下,每次应用重启时,都会记录显示状态评估差异的报告。 报告显示了你在添加或移除豆子和设置配置属性等更改时,应用程序自动配置的变化。
要禁用报告的日志,请设置以下属性:
-
Properties
-
YAML
spring.devtools.restart.log-condition-evaluation-delta=false
spring:
devtools:
restart:
log-condition-evaluation-delta: false
排除资源
某些资源在更改时不一定需要触发重启。
例如,Thymeleaf 模板可以在原地编辑。
默认情况下,在 中更改资源/元步兵/专家,/元补强/资源,/资源,/静态的,/公共或/模板不会触发重启,但会触发一次实时装填。
如果你想自定义这些排除项,可以使用Spring.devtools.restart.exclude财产。
例如,只排除/静态的和/公共你将设置以下属性:
-
Properties
-
YAML
spring.devtools.restart.exclude=static/**,public/**
spring:
devtools:
restart:
exclude: "static/**,public/**"
如果你想保留默认设置并添加额外的排除,可以使用Spring.DevTools.Restart.additional-exclude而是财产。 |
禁用重启
如果你不想使用重启功能,可以通过以下方式禁用它spring.devtools.restart.enabled财产。
在大多数情况下,你可以将该属性设置在你的application.properties(如此仍会初始化重启类加载器,但不会监控文件变更。)
如果你需要完全禁用重启支持(例如,因为它不支持某个特定库),你需要设置spring.devtools.restart.enabled 系统属性到false在呼唤之前SpringApplication.run(...)如下例所示:
-
Java
-
Kotlin
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,你可能更倾向于只在特定时间触发重启。 为此,您可以使用“触发文件”,这是一个特殊文件,当你想真正触发重启检查时必须修改它。
| 任何文件更新都会触发检查,但只有当Devtools检测到重启有相关内容时才会真正启动。 |
要使用触发文件,设置spring.devtools.restart.trigger-file属性是触发文件的名称(不包括任何路径)。
触发文件必须出现在你的类路径上某个位置。
例如,如果你有一个结构如下的项目:
src
+- main
+- resources
+- .reloadtrigger
然后你触发文件属性为:
-
Properties
-
YAML
spring.devtools.restart.trigger-file=.reloadtrigger
spring:
devtools:
restart:
trigger-file: ".reloadtrigger"
现在只有在src/main/resources/.reloadtrigger已更新。
你可能想设置一下spring.devtools.restart.trigger-file作为一个全局设置,这样你所有的项目都能以相同方式表现。 |
有些IDE有功能,可以省去手动更新触发文件。Eclipse 的 Spring Tools 和 IntelliJ IDEA(终极版)都有这样的支持。
用Spring Tools,你可以在控制台视图里按“重新加载”按钮(只要你触发文件被命名为.reloadtrigger).
对于IntelliJ IDEA,你可以按照他们文档中的说明作。
自定义重启类加载器
如前述“重启与重载”部分所述,重启功能通过使用两个类加载器实现。
如果这导致了问题,你可以用spring.devtools.restart.enabled系统属性,如果应用关闭重启后能用,你可能需要自定义哪个 classloader 加载的内容。
默认情况下,IDE中任何打开的项目都会加载“重启”类加载器,以及任何普通项目。罐文件被加载为“基础”类加载程序。
如果你用MVN Spring-boot:run或gradle bootRun:包含你的项目@SpringBootApplication加载了“重启”类加载器,其他所有内容都装载了“基础”类加载器。
当你启动应用时,类路径会印在控制台上,这有助于识别任何有问题的条目。
用于反射性的类,尤其是注释,可以在启动时加载到父类加载器(固定类)中,先于使用它们的应用类,这可能导致 Spring 在应用程序中无法检测到它们。
你可以通过创建一个META-INF/spring-devtools.properties文件。
这Spring-devtools.properties文件可以包含前缀为restart.exclude和restart.include.
这包括元素是应当被拉入“重启”类加载器的项目,并且排除元素是应推入“基础”类加载器的项目。
该属性的值是一个正则表达式模式,应用于启动时传递给JVM的类路径。
这里有一个示例,部分本地类文件被排除,而在重启类加载器中包含了一些额外的库:
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 的ConfigurableObjectInputStream与Thread.currentThread().getContextClassLoader().
不幸的是,一些第三方库在反序列化时未考虑上下文类加载器。 如果发现了这样的问题,你需要向原作者申请修复。
LiveReload
这Spring-boot-devtools模块包含一个嵌入式的LiveReload服务器,可用于在资源变更时触发浏览器刷新。
LiveReload浏览器扩展免费适用于Chrome、Firefox和Safari。
你可以通过在你选择的浏览器的市场或商店搜索“LiveReload”来找到这些扩展。
如果你想在应用运行时启动LiveReload服务器,可以设置spring.devtools.livereload.enabled属性到true.
| 你一次只能运行一个LiveReload服务器。 启动应用前,确保没有其他LiveReload服务器在运行。 如果你从 IDE 启动多个应用程序,只有第一个支持LiveReload。 |
| 要在文件发生变化时触发LiveReload,必须启用自动重启。 |
全局设置
你可以通过添加以下任一文件来配置全局开发者工具的设置$HOME/.config/spring-boot目录:
-
Spring-boot-DevTools.properties -
Spring-boot-DevTools.yaml -
spring-boot-devtools.yml
添加到这些文件上的任何属性都适用于你机器上所有使用 devtools 的 Spring Boot 应用程序。
例如,要配置restart始终使用触发文件,你可以在你的Spring-boot-devtools文件:
-
Properties
-
YAML
spring.devtools.restart.trigger-file=.reloadtrigger
spring:
devtools:
restart:
trigger-file: ".reloadtrigger"
默认情况下,$HOME是用户的主目录。
要自定义该位置,请设置SPRING_DEVTOOLS_HOME环境变量或Spring.devtools.home系统属性。
如果 devtools 配置文件在$HOME/.config/spring-boot,是 的根$HOME在目录中搜索是否存在.spring-boot-devtools.properties文件。
这允许你与使用旧版 Spring Boot 但不支持$HOME/.config/spring-boot位置。 |
|
开发工具的属性/yaml文件不支持配置文件。 任何激活的配置文件 |
配置文件系统观察者的配置
文件系统观察者它通过轮询特定时间区间的类变更,然后等待预设的安静期以确保没有更多变化。
由于 Spring Boot 完全依赖 IDE 编译并复制文件到其读取位置,你可能会发现某些更改在 devtools 重启应用时没有被反映。
如果你经常遇到这样的问题,试着提高spring.devtools.restart.poll-interval和spring.devtools.restart.quiet-period适合你开发环境的参数参数:
-
Properties
-
YAML
spring.devtools.restart.poll-interval=2s
spring.devtools.restart.quiet-period=1s
spring:
devtools:
restart:
poll-interval: "2s"
quiet-period: "1s"
监控的类路径目录现在每2秒轮询一次以获取变化,并保持1秒的静默期以确保没有额外的类别更改。
远程应用
Spring Boot 开发工具并不限于本地开发。 远程运行应用时,你还可以使用多种功能。 远程支持是自愿支持的,因为启用可能存在安全风险。 只有在可信网络上运行或使用 SSL 保护时才应启用。 如果这两个选项都不可用,就不要使用DevTools的远程支持。 你绝不应该在生产部署时启用支持。
要启用它,你需要确保开发工具包含在重新包装的档案中,如下列表所示:
<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财产。
像任何重要的密码或秘密一样,数值应当独特且强大,无法被猜测或暴力破解。
远程开发工具支持分为两部分:一个是接受连接的服务器端端点,另一个是你在 IDE 中运行的客户端应用。
当Spring.DevTools.Remote.secret属性被设置。
客户端组件必须手动启动。
| Spring WebFlux 应用程序不支持 Remote DevTools。 |
运行远程客户端应用
远程客户端应用设计为在你的IDE内部运行。
你得跑远程春应用使用与你连接的远程项目相同的类路径。
应用程序唯一需要的参数是它连接的远程 URL。
例如,如果你使用 Eclipse 或 Spring Tools,并且有一个名为我的应用如果你已经部署到 Cloud Foundry,你需要做以下作:
-
选择
运行配置......来自执行菜单。 -
创建一个新的
Java 应用“发射配置”。 -
浏览
我的应用项目。 -
用
远程春应用作为主职业。 -
加
https://myapp.cfapps.io前往程序参数(或者你远程网址是什么)。
一个运行中的远程客户端可能如下列表:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \
\\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) )
' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / /
=========|_|==============|___/===================================/_/_/_/
:: 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.host和Spring.devtools.remote.proxy.port性能。 |
远程更新
远程客户端会像本地重启一样监控你的应用类路径变化。 任何更新的资源都会被推送到远程应用程序,并且(如有需要)会触发重启。 如果你在本地没有云服务的功能上迭代,这会很有帮助。 通常,远程更新和重启比完整的重建和部署周期要快得多。
在较慢的开发环境中,安静期可能不够,班级变更可能会被拆分成批次。 服务器在第一批职业更改上传后重启。 下一批文件无法发送给应用程序,因为服务器正在重启。
这通常通过警告表现为远程春应用记录了未能上传部分课程,以及随后的重试。
但这也可能导致应用代码不一致,以及在第一批更改上传后无法重启。
如果你经常遇到这样的问题,试着提高spring.devtools.restart.poll-interval和spring.devtools.restart.quiet-period参数以适应你的开发环境。
有关配置这些属性,请参见“配置文件系统观察者”部分。
| 文件只有在远程客户端运行时才会被监控。 如果你在启动远程客户端前更改文件,它不会被推送到远程服务器。 |