Spring Boot 2.0 熱部署指南

來源:互聯網
上載者:User

標籤:sof   構建項目   包含   autoconf   react   特殊檔案   手動   oid   cat   

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元素是應該被拉入到“重啟”類載入器中的項目,而排除元素是應該被下推到“基本”類載入器中的項目。 該屬性的值是應用於類路徑的Regex模式,如以下樣本所示:

restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jarrestart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar

 

 所有屬性鍵必須是唯一的。 只要屬性以restart.include開頭。 或重新啟動。排除。 已經被考慮了。

載入類路徑中的所有META-INF / spring-devtools.properties。 您可以將檔案打包到您的項目中,也可以打包到項目使用的庫中。

3.9  著名的限制

對於使用標準ObjectInputStream進行還原序列化的對象,重新啟動功能無法正常工作。

如果你需要還原序列化資料,你可能需要結合使用Spring的ConfigurableObjectInputStream和Thread.currentThread()。getContextClassLoader()。

不幸的是,有些第三方庫還原序列化而沒有考慮上下文類載入器。 如果您發現這樣的問題,您需要向原作者請求修複。

Spring Boot 2.0 熱部署指南

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.