Spring Boot DevTools使用教程
DevTools通過提供自動重啟和LiveReload功能,使您更快、更輕鬆地開發Spring Boot應用程式。除此之外,它還將各種屬性設定為更適合本地開發的值。此外,它允許您遠端連線到您的應用程式,並仍然使用其大部分功能。在生產中執行時,不要使用DevTools。
如何使用DevTools進一步加快Spring Boot開發速度?你需要做的就是新增正確的依賴關係,與Spring Boot一樣,設定非常簡單。
如果您使用Maven:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>
或者,使用Gradle時:
configurations { developmentOnly runtimeClasspath { extendsFrom developmentOnly } } dependencies { developmentOnly("org.springframework.boot:spring-boot-devtools") }
依賴項宣告為可選。這個很重要。這可以防止DevTools依賴性傳遞性地應用於依賴於你專案的其他模組。
自動重啟
每當類路徑中的檔案發生更改時,DevTools會自動重新啟動正在執行的應用程式,並應用新的更改。在本地開發時,這可能很有價值,因為您不需要手動重新部署應用程式。
重啟仍然需要花費很多時間,你可能認為它不會那麼有用,。幸運的是,這些重啟比常規重啟更快,因為DevTools使用了一個聰明的技巧。
在開發應用程式時,您通常會更改一個或多個類,並希望檢查正在執行的應用程式中的結果以獲得反饋。您更改應用程式的一小部分,因為大多數載入的類來自框架和第三方庫。
,Spring DevTools使用兩個類載入器 - base和restart。base類載入器載入不更改的類。你正在使用的類由restart類載入器載入。每當觸發重啟時,都會重新啟動並重新建立restart的類載入器。這樣重新啟動應用程式的速度比平常快得多,並且可以使用JRebel等工具作為動態類重新載入的替代方法。
在IDE中觸發重新啟動
只要類路徑發生更改,就會觸發重新啟動。但是,這取決於您的IDE。這意味著,僅僅更改.java檔案是不夠的。重要的是您的IDE實際上更新.class了類路徑上的檔案。
使用IntelliJ IDEA時,您需要構建專案(Ctrl + F9或Build→Build Project)。您還可以將IDEA配置為自動重建。或者,需要開啟Spring Boot執行配置並定義觸發應用程式更新時發生的情況,Alt + Shift + F10 或F9 進行執行配置,選擇編輯配置:
在On Update action中選擇Update trigger file,在呼叫Update操作時觸發DevTools的Restart;甚至可以選擇嘗試熱插拔的選項,並僅在熱插拔失敗時使用DevTools重新啟動。
在On frame deactivation中選擇Update classes and resources。在IDEA視窗失去焦點時重新載入所有靜態資源和模板(例如,切換到瀏覽器視窗時)。
確認後,修改原始碼,切換到瀏覽器,重新整理瀏覽器,可以看到更新後的結果,如果還不行按(Ctrl + F10)強行更新重啟。
僅限開發
Spring Boot DevTools的用法僅用於開發,而不用於生產。如果您的應用程式檢測到您正在生產中執行,則會自動禁用DevTools。
部署時有兩種模式:fully packaged artifact完全打包和exploded artifact ;採取前者打包方式Spring會認為是生產應用;後者認為是開發模式,在Idea等IDE中採取的是後者。
Live Reload
ofollow,noindex" target="_blank">LiveReload 是一個有用的工具,它允許您在檔案中進行更改時立即在瀏覽器中更新頁面,如HTML,CSS,影象等。它甚至可以根據需要預處理檔案 - 這意味著自動編譯SASS或LESS檔案。
Spring DevTools自動啟動LiveReload伺服器的本地例項,該伺服器監視您的檔案。您需要做的就是安裝一個瀏覽器擴充套件 ,然後你就可以了。它不僅可用於開發應用程式的前端(如果將其作為Spring應用程式工件的一部分進行分發),還可用於監視和重新載入REST API的輸出。
屬性覆蓋
在本地開發應用程式時,與在生產環境相比通常需要不同的配置。自己管理多組配置是不必要的複雜。好訊息是Spring Boot DevTools為您的本地開發配置了許多開箱即用的屬性。
spring.thymeleaf.cache=false spring.freemarker.cache=false spring.groovy.template.cache=false spring.mustache.cache=false server.servlet.session.persistent=true spring.h2.console.enabled=true spring.resources.cache.period=0 spring.resources.chain.cache=false spring.template.provider.cache=false spring.mvc.log-resolved-exception=true server.servlet.jsp.init-parameters.development=true spring.reactor.stacktrace-mode.enabled=true
可以檢查DevToolsPropertyDefaultsPostProcessor 中所有屬性的列表 。
遠端連線
除本地開發外,您還可以連線到執行DevTools的遠端應用程式。這不適用於生產環境,因為它可能是一個嚴重的安全風險。但是,它在預生產環境中非常有用。
預設情況下不啟用遠端連線。您需要通過修改pom檔案顯式啟用它:
<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=somesecret
遠端應用程式執行後,您可以啟動遠端連線會話,現在,您需要啟動org.springframework.boot.devtools.RemoteSpringApplication,使用遠端應用程式的URL作為引數啟動。請注意,https如果可能,請使用https。
在IDE中輕鬆執行遠端連線。在IDEA中,您只需建立一個新的執行配置。轉到Run → Edit Configurations...並建立一個+左上角帶有圖示的新配置。選擇Application型別。
從DevTools模組中選擇RemoteSpringApplication作為Main類,並設定遠端引數遠端應用程式的URL。
執行此配置後,如果與遠端應用程式的連線成功,您應該會看到相應的輸出。
連線到遠端應用程式後,DevTools監視類路徑更改,與本地開發相同。但是,它不是本地重新啟動,而是將更改推送到遠端伺服器並在那裡觸發重新啟動。這比構建應用程式和部署到遠端計算機要快得多。
全域性配置
可以像使用任何其他Spring應用程式一樣使用配置屬性配置DevTools。這通常意味著編輯application.properties您的專案。此配置對於每個應用程式是獨立的。
但是,在某些情況下,為同一臺計算機上執行的所有應用程式進行全域性配置可能很方便。您可以建立一個名為.spring-boot-devtools.properties位於$HOME目錄中的屬性檔案。此檔案中宣告的配置將應用於執行DevTools的所有應用程式。
限制
使用DevTools的Spring應用程式會自動啟動LiveReload伺服器。不幸的是,此伺服器中只有一個例項可以同時執行。更確切地說,只有第一個可行。這不僅適用於使用DevTools的Spring應用程式的多個例項,也適用於任何其他應用程式,這些應用程式也在後臺使用LiverReload,例如Gatsby 在開發模式下。
如果要將Spring應用程式配置為不啟動LiveReload伺服器,可以在application.properties加入:
spring.devtools.livereload.enabled=false
關機鉤ShutdownHook
DevTools依賴於關機掛鉤 的SpringApplication。如果您使用以下方法手動禁用掛鉤,它將無法正常工作:
springApplication.setRegisterShutdownHook(false);
認情況下,掛鉤已啟用,因此除非您明確禁用它,否則無需擔心它。
與第三方庫的衝突
DevTools通常應該正常執行,但它可能與第三方庫有衝突。特別是,已知問題 是使用標準ObjectInputStream進行反序列化存在存在衝突。如果發生此類衝突,您可以通過設定禁用自動重啟:
spring.devtools.restart.enabled=false
將不再觸發重啟。但是,仍將使用重新啟動類載入器。如果您需要完全禁用類載入器,則需要在啟動應用程式之前執行此操作:
public static void main(String args) { System.setProperty("spring.devtools.restart.enabled", "false"); SpringApplication.run(MyApp.class, args); }
即使您不使用自動重啟,您仍然可以從DevTools提供的其他功能中受益。