開發者工具
Spring Boot 包含一組額外的工具,可以使應用程式開發體驗更愉悅。spring-boot-devtools 模組可以包含在任何專案中,以提供額外的開發時功能。要包含 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")
}
| 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 配置。 |
屬性預設值
Spring Boot 支援的幾個庫使用快取來提高效能。例如,模板引擎 快取編譯的模板,以避免重複解析模板檔案。此外,Spring MVC 在提供靜態資源時可以向響應新增 HTTP 快取頭。
雖然快取對生產環境非常有利,但在開發過程中可能會適得其反,阻止您看到剛在應用程式中所做的更改。因此,spring-boot-devtools 預設停用快取選項。
快取選項通常透過 application.properties 檔案中的設定進行配置。例如,Thymeleaf 提供 spring.thymeleaf.cache 屬性。
對於跟蹤機率也一樣,預設設定為 100% 可能不會記錄用於測試的所有跟蹤。
無需手動設定這些屬性,spring-boot-devtools 模組會自動應用合理的開發時配置。
下表列出了所有應用的屬性
| 名稱 | 預設值 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果您不希望應用屬性預設值,可以在 application.properties 中將 spring.devtools.add-properties 設定為 false。 |
由於您在開發 Spring MVC 和 Spring WebFlux 應用程式時需要更多關於 Web 請求的資訊,開發人員工具建議您為 web 日誌組啟用 DEBUG 級別日誌記錄。這將為您提供關於傳入請求、處理請求的處理程式、響應結果和其他詳細資訊。如果您希望記錄所有請求詳細資訊(包括可能敏感的資訊),可以開啟 spring.mvc.log-request-details 或 spring.http.codecs.log-request-details 配置屬性。
自動重啟
使用 spring-boot-devtools 的應用程式會在 classpath 中的檔案更改時自動重啟。這在 IDE 中工作時是一個有用的功能,因為它為程式碼更改提供了非常快速的反饋迴圈。預設情況下,classpath 中指向目錄的任何條目都會被監控以檢測更改。請注意,某些資源(例如靜態資產和檢視模板)不需要重啟應用程式。
如果您使用構建外掛透過 Maven 或 Gradle 進行重啟,則必須將 forking 設定為 enabled。如果停用 forking,devtools 使用的獨立應用程式類載入器將不會建立,並且重啟將無法正常執行。 |
| 自動重啟與 LiveReload 結合使用效果非常好。有關詳細資訊,請參閱LiveReload 部分。如果您使用 JRebel,自動重啟會被停用,轉而使用動態類重新載入。其他 devtools 功能(如 LiveReload 和屬性覆蓋)仍可使用。 |
DevTools 依賴於應用程式上下文的關閉鉤子在重啟期間關閉它。如果您停用了關閉鉤子(SpringApplication.setRegisterShutdownHook(false)),它將無法正常工作。 |
DevTools 需要自定義 ResourceLoader,該 ResourceLoader 由 ApplicationContext 使用。如果您的應用程式已經提供了一個,它將被包裝。不支援直接覆蓋 ApplicationContext 上的 getResource 方法。 |
| 使用 AspectJ 織入時不支援自動重啟。 |
記錄條件評估的變化
預設情況下,每次應用程式重啟時,都會記錄一個顯示條件評估增量的報告。該報告顯示了您在新增或刪除 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.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 Tools 和 IntelliJ IDEA (Ultimate Edition) 都支援此功能。使用 Spring Tools,您可以使用控制檯檢視中的“重新載入”按鈕(只要您的 trigger-file 被命名為 .reloadtrigger)。對於 IntelliJ IDEA,您可以按照其文件中的說明進行操作。
自定義重啟類載入器
如重啟與重新載入部分所述,重啟功能是透過使用兩個類載入器來實現的。如果這導致問題,您可以使用 spring.devtools.restart.enabled 系統屬性來診斷問題,如果應用程式在關閉重啟後正常工作,您可能需要自定義哪些內容由哪個類載入器載入。
預設情況下,IDE 中的任何開啟專案都使用“重啟”類載入器載入,而任何常規 .jar 檔案都使用“基本”類載入器載入。如果您使用 mvn spring-boot:run 或 gradle bootRun 也是如此:包含您的 @SpringBootApplication 的專案使用“重啟”類載入器載入,其他所有內容都使用“基本”類載入器載入。應用程式啟動時會在控制檯列印 classpath,這有助於識別任何有問題的地方。反射使用的類,特別是註解,在應用程式使用它們之前可能被載入到父(固定)類載入器中,這可能導致它們未被 Spring 在應用程式中檢測到。
您可以透過建立 META-INF/spring-devtools.properties 檔案來指示 Spring Boot 使用不同的類載入器載入專案的一部分。spring-devtools.properties 檔案可以包含以 restart.exclude 和 restart.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 的 ConfigurableObjectInputStream 和 Thread.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 設定
-
spring-boot-devtools.properties -
spring-boot-devtools.yaml -
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。 在 |
配置檔案系統監視器
FileSystemWatcher 透過以一定時間間隔輪詢類更改,然後等待預定義的靜默期以確保沒有更多更改來工作。由於 Spring Boot 完全依賴 IDE 來編譯檔案並將其複製到 Spring Boot 可以讀取它們的位置,您可能會發現在某些情況下,devtools 重啟應用程式時某些更改未得到反映。如果您經常觀察到此類問題,請嘗試將 spring.devtools.restart.poll-interval 和 spring.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.host 和 spring.devtools.remote.proxy.port 屬性。 |
遠端更新
遠端客戶端以與本地重啟相同的方式監控應用程式 classpath 中的更改。任何更新的資源都會被推送到遠端應用程式,並且(如果需要)觸發重啟。如果您迭代的功能使用本地沒有的雲服務,這可能會很有用。通常,遠端更新和重啟比完整的重建和部署週期快得多。
在較慢的開發環境中,靜默期可能不夠,並且類的更改可能會分成批次。伺服器在第一批類更改上傳後重新啟動。下一批無法傳送到應用程式,因為伺服器正在重新啟動。
這通常表現為 RemoteSpringApplication 日誌中關於上傳某些類失敗並隨後重試的警告。但這也可能導致應用程式程式碼不一致,並在上傳第一批更改後無法重新啟動。如果您持續觀察到此類問題,請嘗試將 spring.devtools.restart.poll-interval 和 spring.devtools.restart.quiet-period 引數增加到適合您的開發環境的值。有關配置這些屬性的資訊,請參閱配置檔案系統監視器部分。
| 只有當遠端客戶端正在執行時,檔案才會被監控。如果您在啟動遠端客戶端之前更改檔案,則不會將其推送到遠端伺服器。 |