此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1! |
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.3.1! |
Spring Boot 包含一组额外的工具,可以使应用程序开发体验更加愉快。
该模块可以包含在任何项目中,以提供额外的开发时功能。
若要包含 devtools 支持,请将模块依赖项添加到构建中,如以下 Maven 和 Gradle 清单所示:spring-boot-devtools
<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")
}
Devtools 可能会导致类加载问题,尤其是在多模块项目中。诊断类加载问题 介绍了如何诊断和解决这些问题。 |
开发人员工具在运行完全打包的应用程序时会自动禁用。
如果应用程序是从特殊类装入器启动的,或者是从特殊类装入器启动的,则将其视为“生产应用程序”。
可以使用 system 属性来控制此行为。
若要启用 devtools,无论用于启动应用程序的类装入器如何,请设置 system 属性。
在运行 devtools 存在安全风险的生产环境中,不得执行此操作。
若要禁用 devtools,请排除依赖项或设置 system 属性。java -jar spring.devtools.restart.enabled -Dspring.devtools.restart.enabled=true -Dspring.devtools.restart.enabled=false |
在 Maven 中将依赖项标记为可选项或在 Gradle 中使用配置(如上所示)可防止 devtools 以可传递方式应用于使用您项目的其他模块。developmentOnly |
默认情况下,重新打包的存档不包含 devtools。
如果要使用某个远程开发工具功能,则需要包含它。
使用 Maven 插件时,将属性设置为 。
使用 Gradle 插件时,请将任务的类路径配置为包含 developmentOnly 配置。excludeDevtools false |
Devtools 可能会导致类加载问题,尤其是在多模块项目中。诊断类加载问题 介绍了如何诊断和解决这些问题。 |
开发人员工具在运行完全打包的应用程序时会自动禁用。
如果应用程序是从特殊类装入器启动的,或者是从特殊类装入器启动的,则将其视为“生产应用程序”。
可以使用 system 属性来控制此行为。
若要启用 devtools,无论用于启动应用程序的类装入器如何,请设置 system 属性。
在运行 devtools 存在安全风险的生产环境中,不得执行此操作。
若要禁用 devtools,请排除依赖项或设置 system 属性。java -jar spring.devtools.restart.enabled -Dspring.devtools.restart.enabled=true -Dspring.devtools.restart.enabled=false |
在 Maven 中将依赖项标记为可选项或在 Gradle 中使用配置(如上所示)可防止 devtools 以可传递方式应用于使用您项目的其他模块。developmentOnly |
默认情况下,重新打包的存档不包含 devtools。
如果要使用某个远程开发工具功能,则需要包含它。
使用 Maven 插件时,将属性设置为 。
使用 Gradle 插件时,请将任务的类路径配置为包含 developmentOnly 配置。excludeDevtools false |
诊断类加载问题
如“重新启动与重新加载”部分所述,重新启动功能是通过使用两个类装入器实现的。 对于大多数应用程序,此方法效果很好。 但是,它有时会导致类加载问题,尤其是在多模块项目中。
要诊断类加载问题是否确实是由 devtools 及其两个类加载器引起的,请尝试禁用 restart。 如果这解决了您的问题,请自定义重新启动类装入器以包含您的整个项目。
属性默认值
Spring Boot 支持的几个库使用缓存来提高性能。 例如,模板引擎缓存已编译的模板,以避免重复解析模板文件。 此外,Spring MVC 可以在提供静态资源时将 HTTP 缓存标头添加到响应中。
虽然缓存在生产环境中非常有益,但在开发过程中可能会适得其反,使您无法看到刚刚在应用程序中所做的更改。 因此,spring-boot-devtools 默认禁用缓存选项。
缓存选项通常由文件中的设置进行配置。
例如,百里香叶(Thymeleaf)提供该物业。
该模块无需手动设置这些属性,而是自动应用合理的开发时配置。application.properties
spring.thymeleaf.cache
spring-boot-devtools
下表列出了应用的所有属性:
名字 | 默认值 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果不希望应用属性默认值,可以在 中设置为 。spring.devtools.add-properties false application.properties |
由于在开发 Spring MVC 和 Spring WebFlux 应用程序时需要有关 Web 请求的更多信息,因此开发人员工具建议您为日志记录组启用日志记录。
这将为您提供有关传入请求、哪个处理程序正在处理它、响应结果和其他详细信息的信息。
如果要记录所有请求详细信息(包括潜在的敏感信息),可以打开 or 配置属性。DEBUG
web
spring.mvc.log-request-details
spring.codec.log-request-details
名字 | 默认值 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果不希望应用属性默认值,可以在 中设置为 。spring.devtools.add-properties false application.properties |
自动重启
每当类路径上的文件发生更改时,使用的应用程序都会自动重新启动。
在 IDE 中工作时,这可能是一个有用的功能,因为它为代码更改提供了非常快速的反馈循环。
默认情况下,类路径上指向目录的任何条目都会受到监视,以防发生更改。
请注意,某些资源(如静态资产和视图模板)不需要重新启动应用程序。spring-boot-devtools
如果您使用 build 插件重新启动 Maven 或 Gradle,则必须将该设置保留为 。
如果禁用 forking,则不会创建 devtools 使用的独立应用程序类装入器,并且重新启动将无法正常运行。forking enabled |
与 LiveReload 一起使用时,自动重启效果非常好。有关详细信息,请参阅 LiveReload 部分。 如果使用 JRebel,则会禁用自动重启,以支持动态类重新加载。 仍然可以使用其他 devtools 功能(如 LiveReload 和属性替代)。 |
DevTools 依赖于应用程序上下文的关闭挂钩在重启期间将其关闭。
如果禁用了关机挂钩 (),则无法正常工作。SpringApplication.setRegisterShutdownHook(false) |
DevTools 需要自定义 .
如果您的应用程序已经提供了一个,它将被包装。
不支持直接覆盖 上的方法。ResourceLoader ApplicationContext getResource ApplicationContext |
使用 AspectJ 编织时不支持自动重启。 |
记录状态评估中的更改
默认情况下,每次应用程序重新启动时,都会记录显示条件评估增量的报告。 该报告显示在您进行更改(例如添加或删除 Bean 以及设置配置属性)时对应用程序自动配置的更改。
若要禁用报表的日志记录,请设置以下属性:
-
Properties
-
YAML
spring.devtools.restart.log-condition-evaluation-delta=false
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
-
Properties
-
YAML
spring.devtools.restart.exclude=static/**,public/**
spring:
devtools:
restart:
exclude: "static/**,public/**"
如果要保留这些默认值并添加其他排除项,请改用该属性。spring.devtools.restart.additional-exclude |
禁用重启
如果不想使用重新启动功能,可以使用该属性禁用它。
在大多数情况下,您可以在 your 中设置此属性(这样做仍然会初始化重新启动类装入器,但它不会监视文件更改)。spring.devtools.restart.enabled
application.properties
如果需要完全禁用重新启动支持(例如,因为它不适用于特定库),则需要将该属性设置为 之前调用,如以下示例所示:spring.devtools.restart.enabled
System
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
那么你的财产将是:trigger-file
-
Properties
-
YAML
spring.devtools.restart.trigger-file=.reloadtrigger
spring:
devtools:
restart:
trigger-file: ".reloadtrigger"
现在,只有在更新时才会重新启动。src/main/resources/.reloadtrigger
您可能希望设置为全局设置,以便所有项目的行为方式相同。spring.devtools.restart.trigger-file |
某些 IDE 具有一些功能,使您无需手动更新触发器文件。Spring Tools for Eclipse 和 IntelliJ IDEA(旗舰版)都有这样的支持。
使用 Spring Tools,您可以使用控制台视图中的“重新加载”按钮(只要 your 被命名为 )。
对于 IntelliJ IDEA,您可以按照其文档中的说明进行操作。trigger-file
.reloadtrigger
自定义重新启动类加载器
如前面的“重新启动与重新加载”部分所述,重新启动功能是通过使用两个类装入器来实现的。
如果这导致问题,可以使用 system 属性诊断问题,如果应用在关闭重启的情况下工作,则可能需要自定义哪个类加载器加载的内容。spring.devtools.restart.enabled
默认情况下,IDE 中任何打开的项目都使用 “restart” 类装入器加载,任何常规文件都使用 “base” 类装入器加载。
如果你使用 or 也是如此:包含 your 的项目用 “restart” 类装入器加载,其他所有项目都用 “base” 类装入器加载。
启动应用时,类路径将打印在控制台上,这有助于识别任何有问题的条目。
反射使用的类,尤其是注释,可以在启动时先加载到使用它们的应用程序类之前加载到父类(固定)类加载器中,这可能会导致 Spring 在应用程序中无法检测到它们。.jar
mvn spring-boot:run
gradle bootRun
@SpringBootApplication
您可以通过创建文件来指示 Spring Boot 使用不同的类加载器加载项目的某些部分。
该文件可以包含以 和 为前缀的属性。
元素是应该被拉到“重新启动”类装入器中的项,而元素是应该被下推到“基本”类装入器中的项。
该属性的值是一个正则表达式模式,该模式应用于启动时传递给 JVM 的类路径。
下面是一个示例,其中排除了一些本地类文件,并在重新启动类加载器中包含了一些额外的库:META-INF/spring-devtools.properties
spring-devtools.properties
restart.exclude
restart.include
include
exclude
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 |
如果您使用 build 插件重新启动 Maven 或 Gradle,则必须将该设置保留为 。
如果禁用 forking,则不会创建 devtools 使用的独立应用程序类装入器,并且重新启动将无法正常运行。forking enabled |
与 LiveReload 一起使用时,自动重启效果非常好。有关详细信息,请参阅 LiveReload 部分。 如果使用 JRebel,则会禁用自动重启,以支持动态类重新加载。 仍然可以使用其他 devtools 功能(如 LiveReload 和属性替代)。 |
DevTools 依赖于应用程序上下文的关闭挂钩在重启期间将其关闭。
如果禁用了关机挂钩 (),则无法正常工作。SpringApplication.setRegisterShutdownHook(false) |
DevTools 需要自定义 .
如果您的应用程序已经提供了一个,它将被包装。
不支持直接覆盖 上的方法。ResourceLoader ApplicationContext getResource ApplicationContext |
使用 AspectJ 编织时不支持自动重启。 |
如果要保留这些默认值并添加其他排除项,请改用该属性。spring.devtools.restart.additional-exclude |
对文件的任何更新都将触发检查,但只有在 Devtools 检测到它有操作时,才会实际重启。 |
您可能希望设置为全局设置,以便所有项目的行为方式相同。spring.devtools.restart.trigger-file |
所有属性键必须是唯一的。
只要一个属性以 开头或被考虑。restart.include. restart.exclude. |
将加载类路径中的所有内容。
您可以将文件打包到项目内部或项目使用的库中。
不能使用系统属性,只能使用属性文件。META-INF/spring-devtools.properties |
LiveReload
该模块包括一个嵌入式 LiveReload 服务器,可用于在资源更改时触发浏览器刷新。
LiveReload 浏览器扩展程序可免费用于 Chrome、Firefox 和 Safari。
您可以通过在所选浏览器的市场或商店中搜索“LiveReload”来找到这些扩展程序。spring-boot-devtools
如果不想在应用程序运行时启动 LiveReload 服务器,可以将该属性设置为 。spring.devtools.livereload.enabled
false
一次只能运行一个 LiveReload 服务器。 在启动应用程序之前,请确保没有其他 LiveReload 服务器正在运行。 如果从 IDE 启动多个应用程序,则只有第一个应用程序支持 LiveReload。 |
若要在文件更改时触发 LiveReload,必须启用自动重新启动。 |
一次只能运行一个 LiveReload 服务器。 在启动应用程序之前,请确保没有其他 LiveReload 服务器正在运行。 如果从 IDE 启动多个应用程序,则只有第一个应用程序支持 LiveReload。 |
若要在文件更改时触发 LiveReload,必须启用自动重新启动。 |
全局设置
可以通过将以下任何文件添加到目录来配置全局 devtools 设置:$HOME/.config/spring-boot
-
spring-boot-devtools.properties
-
spring-boot-devtools.yaml
-
spring-boot-devtools.yml
添加到这些文件的任何属性都适用于计算机上使用 devtools 的所有 Spring Boot 应用程序。
例如,若要将重新启动配置为始终使用触发器文件,请将以下属性添加到文件中: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 配置文件,则在目录的根目录中搜索文件是否存在。
这允许您与不支持该位置的旧版本的 Spring Boot 上的应用程序共享 devtools 全局配置。$HOME/.config/spring-boot $HOME .spring-boot-devtools.properties $HOME/.config/spring-boot |
devtools properties/yaml 文件中不支持配置文件。 在其中激活的任何配置文件都不会影响特定于配置文件的配置文件的加载。
不支持 YAML 和属性文件中的配置文件特定文件名(形式)和文档。 |
配置文件系统观察程序
FileSystemWatcher
的工作原理是轮询具有特定时间间隔的类更改,然后等待预定义的静默期以确保没有更多更改。
由于 Spring Boot 完全依赖于 IDE 来编译文件并将其复制到 Spring Boot 可以读取它们的位置,因此您可能会发现,有时当 devtools 重新启动应用程序时,某些更改不会反映出来。
如果经常观察到此类问题,请尝试将 and 参数增加到适合您的开发环境的值: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 秒的静默期以确保没有其他类更改。
如果在 中找不到 devtools 配置文件,则在目录的根目录中搜索文件是否存在。
这允许您与不支持该位置的旧版本的 Spring Boot 上的应用程序共享 devtools 全局配置。$HOME/.config/spring-boot $HOME .spring-boot-devtools.properties $HOME/.config/spring-boot |
devtools properties/yaml 文件中不支持配置文件。 在其中激活的任何配置文件都不会影响特定于配置文件的配置文件的加载。
不支持 YAML 和属性文件中的配置文件特定文件名(形式)和文档。 |
远程应用程序
Spring Boot 开发人员工具不仅限于本地开发。 远程运行应用程序时,您还可以使用多种功能。 远程支持是选择加入的,因为启用它可能会带来安全风险。 只有在受信任的网络上运行或使用 SSL 保护时,才应启用它。 如果这两个选项都不可用,则不应使用 DevTools 的远程支持。 切勿启用对生产部署的支持。
要启用它,您需要确保它包含在重新打包的存档中,如以下清单所示: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 应用程序不支持远程开发工具。 |
运行远程客户端应用程序
远程客户端应用程序设计为在 IDE 中运行。
您需要使用与连接到的远程项目相同的类路径运行。
应用程序的单个必需参数是它连接到的远程 URL。org.springframework.boot.devtools.RemoteSpringApplication
例如,如果您使用的是 Eclipse 或 Spring Tools,并且您有一个名为 Cloud Foundry 的项目,则可以执行以下操作:my-app
-
从菜单中选择。
Run Configurations…
Run
-
创建新的“启动配置”。
Java Application
-
浏览项目。
my-app
-
用作主类。
org.springframework.boot.devtools.RemoteSpringApplication
-
添加到(或任何您的远程 URL 是什么)。
https://myapp.cfapps.io
Program arguments
正在运行的远程客户端可能类似于以下清单:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \
\\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) )
' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / /
=========|_|==============|___/===================================/_/_/_/
:: Spring Boot Remote :: (v3.3.2-SNAPSHOT)
2024-06-22T03:35:28.253Z INFO 81424 --- [ main] o.s.b.devtools.RemoteSpringApplication : Starting RemoteSpringApplication v3.3.2-SNAPSHOT using Java 17.0.11 with PID 81424 (/Users/myuser/.m2/repository/org/springframework/boot/spring-boot-devtools/3.3.2-SNAPSHOT/spring-boot-devtools-3.3.2-SNAPSHOT.jar started by myuser in /opt/apps/)
2024-06-22T03:35:28.278Z INFO 81424 --- [ main] o.s.b.devtools.RemoteSpringApplication : No active profile set, falling back to 1 default profile: "default"
2024-06-22T03:35:29.107Z INFO 81424 --- [ main] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
2024-06-22T03:35:29.175Z INFO 81424 --- [ main] o.s.b.devtools.RemoteSpringApplication : Started RemoteSpringApplication in 2.072 seconds (process running for 3.238)
由于远程客户端使用与实际应用程序相同的类路径,因此它可以直接读取应用程序属性。
这就是读取属性并将其传递到服务器进行身份验证的方式。spring.devtools.remote.secret |
始终建议将其用作连接协议,以便对流量进行加密并且无法拦截密码。https:// |
如果需要使用代理访问远程应用程序,请配置 and 属性。spring.devtools.remote.proxy.host spring.devtools.remote.proxy.port |
远程更新
远程客户端以与本地重新启动相同的方式监视应用程序类路径的更改。 任何更新的资源都会推送到远程应用程序,并(如果需要)触发重新启动。 如果迭代使用本地没有的云服务的功能,这将很有帮助。 通常,远程更新和重启比完整的重新生成和部署周期快得多。
在较慢的开发环境中,可能会出现静默期不够的情况,类中的更改可能会被分成批处理。 上传第一批类更改后,服务器将重新启动。 由于服务器正在重新启动,因此无法将下一批发送到应用程序。
这通常表现为日志中有关无法上传某些类的警告,以及随后的重试。
但也可能导致应用程序代码不一致,上传第一批更改后无法重启。
如果经常观察到此类问题,请尝试将 and 参数增加到适合您的开发环境的值。
有关配置这些属性的信息,请参阅配置文件系统观察程序部分。RemoteSpringApplication
spring.devtools.restart.poll-interval
spring.devtools.restart.quiet-period
仅当远程客户端正在运行时,才会监视文件。 如果在启动远程客户端之前更改文件,则不会将其推送到远程服务器。 |
Spring WebFlux 应用程序不支持远程开发工具。 |
由于远程客户端使用与实际应用程序相同的类路径,因此它可以直接读取应用程序属性。
这就是读取属性并将其传递到服务器进行身份验证的方式。spring.devtools.remote.secret |
始终建议将其用作连接协议,以便对流量进行加密并且无法拦截密码。https:// |
如果需要使用代理访问远程应用程序,请配置 and 属性。spring.devtools.remote.proxy.host spring.devtools.remote.proxy.port |
仅当远程客户端正在运行时,才会监视文件。 如果在启动远程客户端之前更改文件,则不会将其推送到远程服务器。 |