Spring Boot DevTools

2025年1月17日 | 阅读时长:4分钟

Spring Boot 1.3 提供了另一个名为 Spring Boot DevTools 的模块。DevTools 代表开发工具。该模块的目标是在使用 Spring Boot 应用程序时尝试缩短开发时间。Spring Boot DevTools 会获取更改并重新启动应用程序。

我们可以通过在 pom.xml 文件中添加以下依赖项来在我们的项目中实现 DevTools。

Spring Boot DevTools 功能

Spring Boot DevTools 提供以下功能

  • 属性默认值
  • 自动重启
  • LiveReload
  • 远程调试隧道
  • 远程更新和重启

属性默认值: Spring Boot 提供了模板技术 Thymeleaf,其中包含属性 spring.thymeleaf.cache。 它会禁用缓存并允许我们更新页面,而无需重新启动应用程序。 但在开发期间设置这些属性总是会产生一些问题。

当我们使用 spring-boot-devtools 模块时,我们不需要设置属性。 在开发期间,Thymeleaf、Freemarker、Groovy 模板的缓存会被自动禁用。

注意:如果我们不想在应用程序上应用属性默认值,我们可以在 application.properties 文件中将 configprop:spring.devtools.add-properties[] 设置为 false。

自动重启: 自动重启意味着重新加载 Java 类并将其配置在服务器端。 在服务器端更改后,它会被动态部署,服务器会重启,并加载修改后的代码。 它主要用于基于微服务的应用程序。 Spring Boot 使用 两种 ClassLoader

  • 未更改的类(第三方 Jar 包)会加载到 base ClassLoader 中。
  • 我们正在积极开发的类会加载到 restart ClassLoader 中。

当应用程序重新启动时,restart ClassLoader 会被抛弃,并填充一个新的 ClassLoader。 因此,base ClassLoader 始终可用并被填充。

我们可以通过将属性 spring.devtools.restart.enabled 设置为 false 来禁用服务器的自动重启。

请记住

  • DevTools 始终监视类路径资源。
  • 触发重启的唯一方法是更新类路径。
  • DevTools 需要一个单独的应用程序类加载器才能正常工作。 默认情况下,Maven 会 fork 应用程序进程。
  • 自动重启与 LiveReload 配合良好。
  • DevTools 依赖于应用程序上下文的关闭钩子,以便在重启期间将其关闭。

LiveReload: Spring Boot DevTools 模块包含一个名为 LiveReload 的嵌入式服务器。 它允许应用程序在我们更改资源时自动触发浏览器刷新。 它也被称为 自动刷新。

注意: 我们可以通过将属性 spring.devtools.livereload.enabled 设置为 false 来禁用 LiveReload。

它为 Chrome、Firefox 和 Safari 提供了浏览器扩展程序。 默认情况下,LiveReload 已启用。 LiveReload 在以下路径上运行

  • /META-INF/maven
  • /META-INF/resources
  • /resources
  • /static
  • /public
  • /templates

我们还可以通过排除上述路径来禁用浏览器中的自动重新加载。 例如

我们可以使用属性 spring.devtools.restart.additional-paths 查看其他附加路径。 例如

如果我们要排除其他路径并保留默认值,则使用属性 spring.devtools.restart.additional-exclude。 例如

请记住

  • 我们一次只能运行一个 LiveReload 服务器。
  • 在启动应用程序之前,请确保没有其他 LiveReload 服务器正在运行。
  • 如果我们从 IDE 启动多个应用程序,它仅支持第一个 LiveReload。

远程调试隧道: Spring Boot 可以通过 HTTP 将 JDWP(Java 调试线协议)直接隧道传输到应用程序。 甚至可以在仅公开端口 80 和 443 的 Internet 云提供商上运行应用程序部署。

远程更新和重启: DevTools 提供的另一个技巧是:它支持远程应用程序 更新重启。 它会监视本地类路径的更改文件,并将它们推送到远程服务器,然后该服务器会重启。 我们也可以将此功能与 LiveReload 结合使用。

使用触发文件

由于频繁的重启,自动重启有时会降低开发时间。 为了解决这个问题,我们可以使用 触发文件。 Spring Boot 会监视触发文件并检测该文件中的修改。 它会重启服务器并重新加载所有之前的更改。

我们可以通过添加属性 spring.devtools.restart.trigger-file 来在我们的应用程序中实现触发文件。 该文件可以是内部文件或外部文件。 例如

Spring Boot DevTools 示例

步骤 1: 使用 Spring Initializr https://start.spring.io/ 创建一个 Maven 项目。

步骤 2: 提供 Group 名称和 Artifact Id。 我们提供了 Group 名称 com.javatpoint 和 Artifact Id spring-boot-devtools-example。

步骤 3: 添加以下依赖项: spring-boot-starter-webspring-boot-devtools

步骤 4: 点击 Generate 按钮。 它会下载项目的 Jar 文件。

步骤 5: 提取 Jar 文件。

步骤 6: 将文件夹导入 STS。 导入需要时间。

文件 -> 导入 -> 现有 Maven 项目 -> 浏览 -> 选择文件夹 spring-boot-devtools-example -> 完成

当项目导入成功后,我们可以在 STS 的 Package Explorer 部分看到以下目录。

Spring Boot DevTools

步骤 7: 打开 SpringBootDevtoolsExampleApplication.java 并将其作为 Java 应用程序运行。

之后,对应用程序进行任何更改(编辑或删除一些文件或代码),并保存这些更改。 一旦我们保存了更改,服务器就会重新启动并获取更改。

Spring Boot DevTools