springboot-devtools模塊能夠實現熱部署,添加類.添加方法,修改配置文件,修改頁面等,都能實現熱部署.
原理就是重啟項目,但比手動重啟快多了,其深層原理是使用了兩個ClassLoder,一個ClassLoader加載哪些不會改變的類(第三方jar包),另一個ClassLoader加載會更改的類.稱之為restart ClassLoader,這樣在有代碼更改的時候,原來的restart Classloader被丟棄,重新創建一個restart ClassLoader,由於需要加載的類相比較少,所以實現了較快的重啟時間(5秒以內)
第一步:
引入插件:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> 不能被其它模塊繼承,如果多個子模塊可以去掉 不必須 <scope>runtime</scope> 只在運行時起作用 打包時不打進去 </dependency>
本人試過,這個plugin可以不加
添加spring-boot-maven-plugin: <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!--fork : 如果沒有該項配置,devtools不會起作用,即應用不會restart 這個要手動加進去 --> <fork>true</fork> </configuration> </plugin> </plugins> </build>
第二步:
啟動項目即可:
1.devTools會監聽classpath下的文件變動,並且會立即重啟應用(發生在保存時機),注意:因為其采用的虛擬機機制,該項重啟是很快的.
2.devtools可以實現頁面熱部署(即頁面修改后會立即生效,這個可以直接在application.properties文件中配置spring.thymeleaf.cache=false來實現)這里注意不同的模板配置不一樣.
如果使用idea,必須需要確保開啟運行時編譯才行
1,設置File ->Setting ->Compile: 勾選“Make project automatically”選項
使用快捷鍵ctrl+alt+shift+/,選擇選項Registry,打開下面的界面 並找到圖中紅框的選項"compller.automake.allow.when.app.running"並勾選
第三步:
重啟idea
idea新建一個spring-boot工程,勾選DevTools即可,pom就會引入相應jar ,該jar默認是runtime 也就是只在運行時使用,打包時不打進去
devtools 原理說明
springboot包括一組額外的工具,可以使應用程序開發體驗更加愉快,springboot-boot-devtools模塊可以包含在任何項目中,它可以節省大量的時間.想要使用devtools支持,只需要將模塊依賴關系添加到你的構建中:
Maven:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>
Gradle:
dependencies { compile("org.springframework.boot:spring-boot-devtools") }
運行打包的應用程序時,開發人員工具會自動禁用,如果你通過java-jar 或者其他特殊的類加載器進行啟動時,都會被認為是"生產環境的應用"
將依賴標記為optional可選,是一種最佳的做法,可以防止將devtools依賴傳遞到其他模塊中,Gradle不支持開箱急用的optional依賴項,你可以參考propdeps-plugin.
屬性默認設置
Spring Boot 支持的一些庫中會使用緩存來提高性能。例如模版引擎將緩存編譯后的模板,以避免重復解析模板文件。 此外,Spring MVC可以在服務靜態資源時向響應中添加HTTP緩存頭。
雖然緩存在生產中非常有益,但它在開發過程中可能會產生反效果,它會阻止你看到剛剛在應用程序中進行的更改。 因此,spring-boot-devtools 將默認禁用這些緩存選項。
緩存選項通常在application.properties 文件中配置。例如,Thymeleaf提供了spring.thymeleaf.cache屬性。spring-boot-devtools 模塊不需要手動設置這些屬性,而是自動應用合理的開發時配置。
自動重啟
spring-boot-devtools會在類路徑上的文件發生更改時自動重啟。 這在IDE中工作時可能是一個有用的功能,因為它為代碼更改提供了非常快的反饋循環。 默認情況下會監視類路徑上的所有變動,但請注意,某些資源(如靜態資源和視圖模板)不需要重啟應用程序。
觸發重啟 當DevTools監視類路徑資源時,觸發重啟的唯一方法是更新類路徑。 導致類路徑更新的方式取決於你正在使用的IDE。
在Eclipse中,保存修改的文件將導致類路徑被更新並觸發重啟。 在IntelliJ IDEA中,構建項目( Build -> Make Project )將具有相同的效果。 重新啟動和重新加載 Spring Boot提供的重新啟動技術使用了兩個類加載器。
不改變的類(例如,來自第三方jar的)被加載到 base 類加載器中。 你正在開發的類被加載到 restart 類加載器中。
當應用程序重啟時, restart加載器將被丟棄,並創建一個新的類加載器。 這種方法意味着應用程序重啟通常比“冷啟動”快得多,因為 base 加載器已經已加載並且可用。
1. 排除資源
某些資源在更改時不一定需要觸發重啟。 例如,可以直接編輯Thymeleaf模板。 默認情況下,更改/META-INF/maven , /META-INF/resources , /resources , /static , /public或/templates中的資源不會觸發重啟,但會觸發實時重新加載。 如果要自定義這些排除項,可以使用spring.devtools.restart.exclude屬性。 例如,要僅排除/static和/public你將設置以下內容:
spring.devtools.restart.exclude = static / **,public / **
如果你想保留上面的默認(情況下的)值並添加其他的排除項,你可以使用
spring.devtools.restart.additional-exclude 屬性。
2. 監控額外的路徑
當你對不在類路徑中的文件進行更改時,可能需要重啟或重新加載應用程序。為此,請使用spring.devtools.restart.additional-paths 屬性來配置監視其他路徑的更改。你可以使用上述的 spring.devtools.restart.exclude 屬性來控制附加路徑下的更改是否會觸發完全重啟或只是實時重新加載 。
3. 禁用重啟
如果不想使用重啟功能,可以使用spring.devtools.restart.enabled屬性來禁用它。 在大多數情況下,你可以在application.properties中設置此項(這仍將初始化重啟類加載器,但不會監視文件更改)。
例如,如果你需要完全禁用重啟支持,因為它不適用於特定庫,則需要在調用SpringApplication.run(…)之前設置System屬性。 例如:
public static void main(String[] args) { System.setProperty("spring.devtools.restart.enabled", "false"); SpringApplication.run(MyApp.class, args); }
4. 使用觸發文件
如果你使用自動編譯已更改文件的IDE,則可能希望僅在特定時間觸發重啟。 為此,你可以使用“觸發文件”,這是一個特殊文件,當你要實際觸發重啟檢查時,必須修改它。 更改文件只會觸發檢查,只有在Devtools檢測到它必須執行某些操作時才會重啟。 觸發文件可以手動更新,也可以通過IDE插件更新。
要使用觸發器文件,請使用spring.devtools.restart.trigger-file屬性。
如果你希望將spring.devtools.restart.trigger-file設置為全局配置,可以參考下面第四小節。
5. 自定義重啟類加載器
如上面重新啟動和重新加載部分所述,重啟功能是通過使用兩個類加載器實現的。 對於大多數應用程序,此方法運行良好,但有時可能會導致類加載問題。
默認情況下,IDE中的任何打開的項目都會使用“restart”類加載器加載,任何常規.jar文件將使用“base”類加載器加載。 如果你在多模塊項目上工作,但不是每個模塊都導入到IDE中,則可能需要自定義配置。 為此,你可以創建一個META-INF/spring-devtools.properties文件。
spring-devtools.properties文件可以包含restart.exclude. 和restart.include. 前綴的屬性。 include元素是應該被放入“restart”類加載器的項目, exclude元素是應該放入“base”類加載器的項目。 屬性的值是應用於類路徑下的正則表達式。
例如:
restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
針對通用Mapper,可以做如下配置:
restart.include.mapper=/mapper-[\\w-\\.]+jar
所有屬性的鍵值(名字,companycommonlibs 部分)必須是唯一的,只有 restart.exclude. 和 restart.include. 開頭的屬性有效。
所有類路徑下面的 META-INF/spring-devtools.properties 配置文件都會生效,所以你可以把該配置打包到每個模塊中。
注:新版本的Mapper(3.4.1+)會默認增加該配置。
6. 已知限制
重啟功能對使用標准ObjectInputStream對象序列化的對象不是很好 。如果需要反序列化數據,可能需要使用Spring的ConfigurableObjectInputStream配合Thread.currentThread().getContextClassLoader() 使用。
不幸的是,一些第三方庫都不考慮在使用上下文類加載器的情況下反序列化。 如果你發現這樣的問題,你需要向原作者請求修復。
實時加載
spring-boot-devtools模塊包含嵌入式LiveReload服務器,可以在資源更改時用於觸發瀏覽器刷新。 LiveReload瀏覽器擴展程序支持Chrome,Firefox和Safari,你可以從livereload.com免費下載。
如果你不想在應用程序運行時啟動LiveReload服務器,則可以將spring.devtools.livereload.enabled屬性設置為false 。
同一時間只能運行一個LiveReload服務器。 開始應用程序之前,請確保沒有其他LiveReload服務器正在運行。如果從IDE啟動多個應用程序,則只有第一個應用程序將支持LiveReload。
全局設置
你可以通過向$HOME文件夾添加名為.spring-boot-devtools.properties的文件來配置全局devtools設置(請注意,文件名以“.”開頭)。 添加到此文件的任何屬性將適用於你的計算機上使用devtools的所有 Spring Boot應用程序。 例如,要配置重啟始終使用觸發器文件 ,你可以添加以下內容:
〜/ .spring-boot-devtools.properties
spring.devtools.reload.trigger-file=.reloadtrigger