開發者工具

Spring Boot 包含一組額外的工具,可以使應用程式開發體驗更愉悅。spring-boot-devtools 模組可以包含在任何專案中,以提供額外的開發時功能。要包含 devtools 支援,請將模組依賴項新增到您的構建中,如以下 Maven 和 Gradle 列表所示

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 可能會導致類載入問題,特別是在多模組專案中。診斷類載入問題 解釋瞭如何診斷和解決這些問題。
當執行完全打包的應用程式時,開發人員工具會自動停用。如果您的應用程式是從 java -jar 啟動的,或者它是從特殊的類載入器啟動的,那麼它被視為“生產應用程式”。您可以透過使用 spring.devtools.restart.enabled 系統屬性來控制此行為。要啟用 devtools,無論用於啟動應用程式的類載入器如何,請設定 -Dspring.devtools.restart.enabled=true 系統屬性。這不能在生產環境中完成,因為執行 devtools 存在安全風險。要停用 devtools,請排除依賴項或設定 -Dspring.devtools.restart.enabled=false 系統屬性。
在 Maven 中將依賴項標記為可選,或在 Gradle 中使用 developmentOnly 配置(如上所示),可以防止 devtools 傳遞性地應用於使用您專案的其他模組。
預設情況下,重新打包的存檔不包含 devtools。如果您想使用某個遠端 devtools 功能,則需要將其包含在內。使用 Maven 外掛時,請將 excludeDevtools 屬性設定為 false。使用 Gradle 外掛時,配置任務的 classpath 以包含 developmentOnly 配置

診斷類載入問題

重啟與重新載入部分所述,重啟功能是透過使用兩個類載入器實現的。對於大多數應用程式,這種方法效果很好。但是,它有時會導致類載入問題,特別是在多模組專案中。

要診斷類載入問題是否確實由 devtools 及其兩個類載入器引起,請嘗試停用重啟。如果這解決了您的問題,請自定義重啟類載入器以包含您的整個專案。

屬性預設值

Spring Boot 支援的幾個庫使用快取來提高效能。例如,模板引擎 快取編譯的模板,以避免重複解析模板檔案。此外,Spring MVC 在提供靜態資源時可以向響應新增 HTTP 快取頭。

雖然快取對生產環境非常有利,但在開發過程中可能會適得其反,阻止您看到剛在應用程式中所做的更改。因此,spring-boot-devtools 預設停用快取選項。

快取選項通常透過 application.properties 檔案中的設定進行配置。例如,Thymeleaf 提供 spring.thymeleaf.cache 屬性。

對於跟蹤機率也一樣,預設設定為 100% 可能不會記錄用於測試的所有跟蹤。

無需手動設定這些屬性,spring-boot-devtools 模組會自動應用合理的開發時配置。

下表列出了所有應用的屬性

名稱 預設值

management.tracing.sampling.probability

1.0

server.servlet.jsp.init-parameters.development

true

server.servlet.session.persistent

true

spring.docker.compose.readiness.wait

only-if-started

spring.freemarker.cache

spring.graphql.graphiql.enabled

true

spring.groovy.template.cache

spring.h2.console.enabled

true

spring.mustache.servlet.cache

spring.mvc.log-resolved-exception

true

spring.reactor.netty.shutdown-quiet-period

0s

spring.template.provider.cache

spring.thymeleaf.cache

spring.web.error.include-binding-errors

always

spring.web.error.include-message

always

spring.web.error.include-stacktrace

always

spring.web.resources.cache.period

0

spring.web.resources.chain.cache

如果您不希望應用屬性預設值,可以在 application.properties 中將 spring.devtools.add-properties 設定為 false

由於您在開發 Spring MVC 和 Spring WebFlux 應用程式時需要更多關於 Web 請求的資訊,開發人員工具建議您為 web 日誌組啟用 DEBUG 級別日誌記錄。這將為您提供關於傳入請求、處理請求的處理程式、響應結果和其他詳細資訊。如果您希望記錄所有請求詳細資訊(包括可能敏感的資訊),可以開啟 spring.mvc.log-request-detailsspring.http.codecs.log-request-details 配置屬性。

自動重啟

使用 spring-boot-devtools 的應用程式會在 classpath 中的檔案更改時自動重啟。這在 IDE 中工作時是一個有用的功能,因為它為程式碼更改提供了非常快速的反饋迴圈。預設情況下,classpath 中指向目錄的任何條目都會被監控以檢測更改。請注意,某些資源(例如靜態資產和檢視模板)不需要重啟應用程式

觸發重啟

由於 DevTools 監控 classpath 資源,觸發重啟的唯一方法是更新 classpath。無論您是使用 IDE 還是構建外掛,修改後的檔案都必須重新編譯才能觸發重啟。您導致 classpath 更新的方式取決於您使用的工具

  • 在 Eclipse 中,儲存修改後的檔案會導致 classpath 更新並觸發重啟。

  • 在 IntelliJ IDEA 中,構建專案(Build -> Build Project)會產生相同的效果。

  • 如果使用構建外掛,執行 Maven 的 mvn compile 或 Gradle 的 gradle build 將觸發重啟。

如果您使用構建外掛透過 Maven 或 Gradle 進行重啟,則必須將 forking 設定為 enabled。如果停用 forking,devtools 使用的獨立應用程式類載入器將不會建立,並且重啟將無法正常執行。
自動重啟與 LiveReload 結合使用效果非常好。有關詳細資訊,請參閱LiveReload 部分。如果您使用 JRebel,自動重啟會被停用,轉而使用動態類重新載入。其他 devtools 功能(如 LiveReload 和屬性覆蓋)仍可使用。
DevTools 依賴於應用程式上下文的關閉鉤子在重啟期間關閉它。如果您停用了關閉鉤子(SpringApplication.setRegisterShutdownHook(false)),它將無法正常工作。
DevTools 需要自定義 ResourceLoader,該 ResourceLoaderApplicationContext 使用。如果您的應用程式已經提供了一個,它將被包裝。不支援直接覆蓋 ApplicationContext 上的 getResource 方法。
使用 AspectJ 織入時不支援自動重啟。
重啟與重新載入

Spring Boot 提供的重啟技術透過使用兩個類載入器來實現。不會更改的類(例如,來自第三方 jar 的類)被載入到 基本 類載入器中。您正在積極開發的類被載入到 重啟 類載入器中。當應用程式重啟時,重啟 類載入器會被丟棄,並建立一個新的。這種方法意味著應用程式重啟通常比“冷啟動”快得多,因為 基本 類載入器已經可用並已填充。

如果您發現應用程式重啟速度不夠快或者遇到類載入問題,您可以考慮使用 ZeroTurnaround 的 JRebel 等重新載入技術。這些技術透過在載入時重寫類來使其更適合重新載入。

記錄條件評估的變化

預設情況下,每次應用程式重啟時,都會記錄一個顯示條件評估增量的報告。該報告顯示了您在新增或刪除 bean 和設定配置屬性等更改後,應用程式自動配置的變化。

要停用報告的日誌記錄,請設定以下屬性

  • 屬性

  • 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,您可以設定以下屬性

  • 屬性

  • YAML

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.devtools.restart.enabled 屬性來停用它。在大多數情況下,您可以在 application.properties 中設定此屬性(這樣做仍然會初始化重啟類載入器,但它不會監視檔案更改)。

如果您需要 完全 停用重啟支援(例如,因為它不適用於特定庫),您需要在呼叫 SpringApplication.run(…​) 之前將 spring.devtools.restart.enabled System 屬性設定為 false,如以下示例所示

  • 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 屬性設定為觸發檔案的名稱(不包括任何路徑)。觸發檔案必須出現在您的 classpath 中的某個位置。

例如,如果您的專案結構如下

src
+- main
   +- resources
      +- .reloadtrigger

那麼您的 trigger-file 屬性將是

  • 屬性

  • 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 ToolsIntelliJ IDEA (Ultimate Edition) 都支援此功能。使用 Spring Tools,您可以使用控制檯檢視中的“重新載入”按鈕(只要您的 trigger-file 被命名為 .reloadtrigger)。對於 IntelliJ IDEA,您可以按照其文件中的說明進行操作。

自定義重啟類載入器

重啟與重新載入部分所述,重啟功能是透過使用兩個類載入器來實現的。如果這導致問題,您可以使用 spring.devtools.restart.enabled 系統屬性來診斷問題,如果應用程式在關閉重啟後正常工作,您可能需要自定義哪些內容由哪個類載入器載入。

預設情況下,IDE 中的任何開啟專案都使用“重啟”類載入器載入,而任何常規 .jar 檔案都使用“基本”類載入器載入。如果您使用 mvn spring-boot:rungradle bootRun 也是如此:包含您的 @SpringBootApplication 的專案使用“重啟”類載入器載入,其他所有內容都使用“基本”類載入器載入。應用程式啟動時會在控制檯列印 classpath,這有助於識別任何有問題的地方。反射使用的類,特別是註解,在應用程式使用它們之前可能被載入到父(固定)類載入器中,這可能導致它們未被 Spring 在應用程式中檢測到。

您可以透過建立 META-INF/spring-devtools.properties 檔案來指示 Spring Boot 使用不同的類載入器載入專案的一部分。spring-devtools.properties 檔案可以包含以 restart.excluderestart.include 為字首的屬性。include 元素是應被拉入“重啟”類載入器的項,exclude 元素是應被推入“基本”類載入器的項。屬性的值是一個正則表示式模式,應用於啟動時傳遞給 JVM 的 classpath。這是一個示例,其中一些本地類檔案被排除,一些額外的庫被包含在重啟類載入器中

restart:
  exclude:
    companycommonlibs: "/mycorp-common-[\\w\\d-\\.]/(build|bin|out|target)/"
  include:
    projectcommon: "/mycorp-myproj-[\\w\\d-\\.]+\\.jar"
所有屬性鍵必須唯一。只要屬性以 restart.include.restart.exclude. 開頭,它就會被考慮在內。
所有 classpath 中的 META-INF/spring-devtools.properties 檔案都會被載入。您可以將檔案打包在您的專案中,或者打包在專案使用的庫中。不能使用系統屬性,只能使用屬性檔案。

已知限制

重啟功能與使用標準 ObjectInputStream 反序列化的物件配合不佳。如果您需要反序列化資料,您可能需要結合使用 Spring 的 ConfigurableObjectInputStreamThread.currentThread().getContextClassLoader()

不幸的是,一些第三方庫在反序列化時沒有考慮上下文類載入器。如果您發現此類問題,您需要向原始作者請求修復。

即時重新載入

spring-boot-devtools 模組包含一個嵌入式 LiveReload 伺服器,當資源發生更改時,可用於觸發瀏覽器重新整理。LiveReload 瀏覽器擴充套件程式可免費用於 Chrome、Firefox 和 Safari。您可以透過在您選擇的瀏覽器的市場或商店中搜索“LiveReload”來找到這些擴充套件程式。

如果您想在應用程式執行時啟動 LiveReload 伺服器,可以將 spring.devtools.livereload.enabled 屬性設定為 true

您一次只能執行一個 LiveReload 伺服器。在啟動應用程式之前,請確保沒有其他 LiveReload 伺服器正在執行。如果從 IDE 啟動多個應用程式,則只有第一個應用程式支援 LiveReload。
要在一個檔案更改時觸發 LiveReload,必須啟用自動重啟

全域性設定

您可以透過將以下任一檔案新增到 $HOME/.config/spring-boot 目錄來配置全域性 devtools 設定

  1. spring-boot-devtools.properties

  2. spring-boot-devtools.yaml

  3. spring-boot-devtools.yml

新增到這些檔案中的任何屬性都適用於您的機器上使用 devtools 的 所有 Spring Boot 應用程式。例如,要配置重啟始終使用觸發檔案,您需要將以下屬性新增到 spring-boot-devtools 檔案中

  • 屬性

  • YAML

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

預設情況下,$HOME 是使用者的主目錄。要自定義此位置,請設定 SPRING_DEVTOOLS_HOME 環境變數或 spring.devtools.home 系統屬性。

如果在 $HOME/.config/spring-boot 中未找到 devtools 配置檔案,則會在 $HOME 目錄的根目錄中搜索是否存在 .spring-boot-devtools.properties 檔案。這使您可以在不支援 $HOME/.config/spring-boot 位置的舊版本 Spring Boot 應用程式中共享 devtools 全域性配置。

devtools 屬性/yaml 檔案中不支援 profiles。

.spring-boot-devtools.properties 中啟用的任何配置檔案都不會影響特定於配置檔案的配置檔案的載入。不支援 YAML 和 Properties 檔案中的特定於配置檔案的檔名(格式為 spring-boot-devtools-<profile>.properties)和 spring.config.activate.on-profile 文件。

配置檔案系統監視器

FileSystemWatcher 透過以一定時間間隔輪詢類更改,然後等待預定義的靜默期以確保沒有更多更改來工作。由於 Spring Boot 完全依賴 IDE 來編譯檔案並將其複製到 Spring Boot 可以讀取它們的位置,您可能會發現在某些情況下,devtools 重啟應用程式時某些更改未得到反映。如果您經常觀察到此類問題,請嘗試將 spring.devtools.restart.poll-intervalspring.devtools.restart.quiet-period 引數增加到適合您的開發環境的值

  • 屬性

  • YAML

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 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 屬性。與任何重要的密碼或秘密一樣,該值應該是唯一且強大的,以便無法猜測或暴力破解。

遠端 devtools 支援分為兩部分:接受連線的伺服器端端點和在 IDE 中執行的客戶端應用程式。當設定 spring.devtools.remote.secret 屬性時,伺服器元件會自動啟用。客戶端元件必須手動啟動。

Spring WebFlux 應用程式不支援遠端 devtools。

執行遠端客戶端應用程式

遠端客戶端應用程式設計為在您的 IDE 中執行。您需要使用與您連線的遠端專案相同的 classpath 執行 RemoteSpringApplication。該應用程式唯一必需的引數是它連線的遠端 URL。

例如,如果您使用 Eclipse 或 Spring Tools 並且您有一個名為 my-app 的專案已部署到 Cloud Foundry,您將執行以下操作

  • Run 選單中選擇 Run Configurations…​

  • 建立一個新的 Java Application “啟動配置”。

  • 瀏覽 my-app 專案。

  • 使用 RemoteSpringApplication 作為主類。

  • https://myapp.cfapps.io 新增到 Program arguments(或您的遠端 URL 是什麼)。

正在執行的遠端客戶端可能類似於以下列表

  .   ____          _                                              __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _          ___               _      \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` |        | _ \___ _ __  ___| |_ ___ \ \ \ \
 \\/  ___)| |_)| | | | | || (_| []::::::[]   / -_) '  \/ _ \  _/ -_) ) ) ) )
  '  |____| .__|_| |_|_| |_\__, |        |_|_\___|_|_|_\___/\__\___|/ / / /
 =========|_|==============|___/===================================/_/_/_/
 :: 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)
由於遠端客戶端使用與實際應用程式相同的 classpath,因此它可以直接讀取應用程式屬性。這就是讀取 spring.devtools.remote.secret 屬性並將其傳遞給伺服器進行身份驗證的方式。
始終建議使用 https:// 作為連線協議,以便流量加密且密碼不會被截獲。
如果您需要使用代理訪問遠端應用程式,請配置 spring.devtools.remote.proxy.hostspring.devtools.remote.proxy.port 屬性。

遠端更新

遠端客戶端以與本地重啟相同的方式監控應用程式 classpath 中的更改。任何更新的資源都會被推送到遠端應用程式,並且(如果需要)觸發重啟。如果您迭代的功能使用本地沒有的雲服務,這可能會很有用。通常,遠端更新和重啟比完整的重建和部署週期快得多。

在較慢的開發環境中,靜默期可能不夠,並且類的更改可能會分成批次。伺服器在第一批類更改上傳後重新啟動。下一批無法傳送到應用程式,因為伺服器正在重新啟動。

這通常表現為 RemoteSpringApplication 日誌中關於上傳某些類失敗並隨後重試的警告。但這也可能導致應用程式程式碼不一致,並在上傳第一批更改後無法重新啟動。如果您持續觀察到此類問題,請嘗試將 spring.devtools.restart.poll-intervalspring.devtools.restart.quiet-period 引數增加到適合您的開發環境的值。有關配置這些屬性的資訊,請參閱配置檔案系統監視器部分。

只有當遠端客戶端正在執行時,檔案才會被監控。如果您在啟動遠端客戶端之前更改檔案,則不會將其推送到遠端伺服器。
© . This site is unofficial and not affiliated with VMware.