Spring Boot 2.0 支持熱部署,實現方法很簡單
Spring Boot 2.0 有幾種熱重載的選項。 推薦的方法是使用spring-boot-devtools
因為它提供了額外的開發時間功能,例如支持快速應用程序重啟和LiveReload以及合理的開發時配置(如模板緩存)。 Devtools通過監視類路徑的變化來工作。 這意味着靜態資源更改必須“建立”,以使更改生效。 默認情況下,當您保存更改時,這會在Eclipse中自動發生。 在IntelliJ IDEA中,Make Project命令觸發必要的構建。 由於默認的重新啟動排除,對靜態資源的更改不會觸發應用程序的重新啟動。 但是,他們確實會觸發實時重新加載。
1. 靜態資源熱部署
如果使用的 Thymeleaf 模板,那么請直接在application.properties中添加
spring.thymeleaf.cache=false
如果使用的 FreeMarker 模板,那么請直接在application.properties中添加
spring.freemarker.cache=false
如果使用的 Groovy 模板,那么請直接在application.properties 中添加
spring.groovy.template.cache=false
2. spring-boot-devtools java熱部署配置
spring-boot-devtools模塊包含對自動應用程序重新啟動的支持。
雖然速度不如JRebel這樣的技術,但它通常比“冷啟動”快得多。
使用方式:
添加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")
}
總結:
如果使用war方式部署的話,修改了java文件,那么必須重啟tomcat.
如果使用jar方式部署,
- Eclipse中保存即可熱部署
- Ideal Indea 需要rebuild project
最常用配置:
# 是否使用模板緩存
spring.thymeleaf.cache=false
#spring.freemarker.cache=false
#spring.groovy.template.cache=false
#如果不想使用重啟功能,可以使用spring.devtools.restart.enabled屬性來禁用它
spring.devtools.restart.enabled=true
#與LiveReload一起使用時,自動重啟的效果非常好。
spring.devtools.livereload.enabled=true
#配置監視其他路徑的更改
spring.devtools.restart.additional-paths=src/main/java
#僅排除/static你將設置以下內容:
spring.devtools.restart.exclude=static/**
3. spring-boot-devtools 熱部署使用
3.1 properties 默認值
spring-boot-devtools模塊會自動應用合理的開發時配置,不需要手動配置。
DevToolsPropertyDefaultsPostProcessor
static {
Map<String, Object> devToolsProperties = new HashMap<>();
devToolsProperties.put("spring.thymeleaf.cache", "false");
devToolsProperties.put("spring.freemarker.cache", "false");
devToolsProperties.put("spring.groovy.template.cache", "false");
devToolsProperties.put("spring.mustache.cache", "false");
devToolsProperties.put("server.servlet.session.persistent", "true");
devToolsProperties.put("spring.h2.console.enabled", "true");
devToolsProperties.put("spring.resources.cache.period", "0");
devToolsProperties.put("spring.resources.chain.cache", "false");
devToolsProperties.put("spring.template.provider.cache", "false");
devToolsProperties.put("spring.mvc.log-resolved-exception", "true");
devToolsProperties.put("server.servlet.jsp.init-parameters.development", "true");
devToolsProperties.put("spring.reactor.stacktrace-mode.enabled", "true");
PROPERTIES = Collections.unmodifiableMap(devToolsProperties);
}
3.2 自動重啟
每當類路徑上的文件發生更改時,使用spring-boot-devtools的應用程序都會自動重新啟動。在IDE中工作時,這可能是一個有用的功能,因為它為代碼更改提供了非常快速的反饋循環。 默認情況下,監視指向文件夾的類路徑中的任何條目以進行更改。 請注意,某些資源(如靜態資產和視圖模板)不需要重新啟動應用程序。
默認僅排除/ static和/ public,您將設置以下屬性:
spring.devtools.restart.exclude=static/**,public/**
Tips; 如果希望保留這些默認值並添加其他排除項,請改用spring.devtools.restart.additional-exclude屬性
3.2.1 觸發重啟
由於DevTools監控類路徑資源,觸發重啟的唯一方法是更新類路徑。 導致類路徑更新的方式取決於您使用的IDE。
在Eclipse中,保存修改后的文件會導致更新類路徑並觸發重新啟動。
在IntelliJ IDEA中,構建項目(Build - > Build Project)具有相同的效果。
3.2.2 LiveReload 一起使用
與LiveReload一起使用時,自動重啟的效果非常好。
如果使用JRebel,則禁用自動重新啟動,以支持動態類重新加載。 其他devtools功能(例如LiveReload和屬性覆蓋)仍然可以使用。
在application.properties添加如下配置
spring.devtools.livereload.enabled=true
- 一次只能運行一個LiveReload服務器。 在開始應用程序之前,請確保沒有其他LiveReload服務器正在運行。 如果您從IDE啟動多個應用程序,則只有第一個應用程序支持LiveReload。
- DevTools依靠應用程序上下文的關閉掛鈎在重新啟動期間關閉它。 如果您禁用了關閉掛鈎(SpringApplication.setRegisterShutdownHook(false)),它將無法正常工作。
- 在決定類路徑中的條目是否會在更改時觸發重新啟動時,DevTools會自動忽略名為spring-boot,spring-boot-devtools,spring-boot-autoconfigure,spring-boot-actuator和spring-boot-starter的項目。
- DevTools需要自定義ApplicationContext使用的ResourceLoader。 如果你的應用程序已經提供了一個,它將被包裝。 不支持直接覆蓋ApplicationContext上的getResource方法。
重新啟動vs重新加載
Spring Boot提供的重啟技術通過使用兩個類加載器來工作。 不會更改的類(例如,來自第三方jar的類)將加載到基類加載器中。 您正在開發的類會加載到重啟類加載器中。 當應用程序重新啟動時,重啟類加載器被丟棄並創建一個新類。 這種方法意味着應用程序重新啟動通常比“冷啟動”快得多,因為基類加載器已經可用並且已被填充。
如果您發現重啟對於您的應用程序來說不夠快,或者遇到類加載問題,則可以考慮從ZeroTurnaround中重新加載技術,例如JRebel。 這些工作通過重寫類,因為它們被加載,使它們更容易重新加載。
3.3 記錄條件評估中的更改
默認情況下,每次應用程序重新啟動時,都會記錄顯示條件評估增量的報告。 該報告顯示了在您進行更改(如添加或刪除Bean以及設置配置屬性)時對應用程序自動配置的更改。
要禁用報告的日志記錄,請設置以下屬性:
spring.devtools.restart.log-condition-evaluation-delta=false
3.4 排除資源
某些資源不一定需要在更改時觸發重新啟動。 例如,可以就地編輯Thymeleaf模板。 默認情況下,更改/ META-INF / maven,/ META-INF / resources,/ resources,/ static,/ public或/ templates中的資源不會觸發重新啟動,但會觸發實時重新加載。 如果你想自定義這些排除,你可以使用spring.devtools.restart.exclude屬性。 例如,要僅排除/ static和/ public,您將設置以下屬性:
spring.devtools.restart.exclude=static/**,public/**
Tips: 如果要保留這些默認值並添加其他排除項,請改為使用spring.devtools.restart.additional-exclude屬性。
3.5 看額外的路徑
您可能希望在更改不在類路徑中的文件時重新啟動或重新加載應用程序。 為此,請使用spring.devtools.restart.additional-paths屬性來配置其他路徑以監視更改。 您可以使用前面介紹的spring.devtools.restart.exclude屬性來控制其他路徑下的更改是觸發完全重新啟動還是實時重新加載。
#配置監視其他路徑的更改
spring.devtools.restart.additional-paths=src/main/java
3.6 禁用重新啟動
如果您不想使用重新啟動功能,則可以使用spring.devtools.restart.enabled屬性將其禁用。
在大多數情況下,您可以在application.properties中設置此屬性(這樣做仍會初始化重新啟動類加載器,但它不會監視文件更改)。
如果需要完全禁用重新啟動支持(例如,因為它不適用於特定庫),則在調用SpringApplication.run(...)之前,需要將spring.devtools.restart.enabled System屬性設置為false,如 如下例所示:
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
3.7 使用觸發文件
如果您使用持續編譯更改文件的IDE,則可能只希望在特定時間觸發重新啟動。 為此,您可以使用“觸發文件”,這是一個特殊文件,當您想要實際觸發重新啟動檢查時必須對其進行修改。 只更改文件會觸發檢查,只有在Devtools檢測到必須執行某些操作時才會重新啟動。 觸發文件可以手動更新或使用IDE插件更新。
要使用觸發器文件,請將spring.devtools.restart.trigger-file屬性設置為觸發器文件的路徑
您可以通過將名為.spring-boot-devtools.properties的文件添加到您的$ HOME文件夾來配置全局devtools設置(請注意文件名以“。”開頭)。 添加到此文件的任何屬性都適用於使用devtools的計算機上的所有Spring Boot應用程序。 例如,要將重新啟動配置為始終使用觸發器文件,您可以添加以下屬性:
~/.spring-boot-devtools.properties.
spring.devtools.reload.trigger-file=.reloadtrigger
您可能需要將spring.devtools.restart.trigger-file設置為全局設置,以便所有項目的行為方式相同。
3.8 自定義重啟類加載器
如前面的“重新啟動vs重新加載”部分所述,重新啟動功能通過使用兩個類加載器來實現。 對於大多數應用程序,這種方法運作良好 但是,它有時會導致類加載問題。
默認情況下,IDE中任何打開的項目都會加載“restart”類加載器,並且任何常規的.jar文件都會加載“base”類加載器。 如果您使用多模塊項目,並且不是每個模塊都導入到IDE中,則可能需要自定義。 為此,您可以創建一個META-INF / spring-devtools.properties文件。
spring-devtools.properties文件可以包含以restart.exclude和restart.include為前綴的屬性。 include元素是應該被拉入到“重啟”類加載器中的項目,而排除元素是應該被下推到“基本”類加載器中的項目。 該屬性的值是應用於類路徑的正則表達式模式,如以下示例所示:
restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
所有屬性鍵必須是唯一的。 只要屬性以restart.include開頭。 或重新啟動。排除。 已經被考慮了。
加載類路徑中的所有META-INF / spring-devtools.properties。 您可以將文件打包到您的項目中,也可以打包到項目使用的庫中。
3.9 著名的限制
對於使用標准ObjectInputStream進行反序列化的對象,重新啟動功能無法正常工作。
如果你需要反序列化數據,你可能需要結合使用Spring的ConfigurableObjectInputStream和Thread.currentThread()。getContextClassLoader()。
不幸的是,有些第三方庫反序列化而沒有考慮上下文類加載器。 如果您發現這樣的問題,您需要向原作者請求修復。
