DevTools in Spring Boot 熱部署 一點課堂(多岸)

DevTools in Spring Boot 熱部署

本文主要了解Spring Boot 1.3.0新添加的spring-boot-devtools模塊的使用,該模塊主要是爲了提升開發者開發Spring Boot應用的用戶體驗。java

要想使用該模塊須要在Maven中添加:git

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
</dependencies>

或者在Gradle配置文件中添加:github

dependencies {
    compile("org.springframework.boot:spring-boot-devtools")
}

一、默認屬性

在Spring Boot集成Thymeleaf時,spring.thymeleaf.cache屬性設置爲false能夠禁用模板引擎編譯的緩存結果。如今,devtools會自動幫你作到這些,禁用全部模板的緩存,包括Thymeleaf, Freemarker, Groovy Templates, Velocity, Mustache等。更多的屬性,請參考DevToolsPropertyDefaultsPostProcessor。web

二、自動重啓

你可能使用過 JRebel 或者 Spring Loaded來自動重啓應用,如今只須要引入devtools就能夠了,當代碼變更時,它會自動進行重啓應用。固然,你也可使用插件來實現,例如在maven中配置插件:正則表達式

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
            </configuration>
        </plugin>
    </plugins>
</build>
bootRun {
    addResources = true
}

DevTools在重啓過程當中依賴於application context的shutdown hook,若是設置SpringApplication.setRegisterShutdownHook(false),則自動重啓將不起做用。spring

排除靜態資源文件

靜態資源文件在改變以後有時候不必觸發應用程序重啓,例如,Thymeleaf的模板會被變量替代。默認的,/META-INF/maven、/META-INF/resources、/resources、/static、/public或者/templates這些目錄下的文件修改以後不會觸發重啓可是會觸發LiveReload。能夠經過spring.devtools.restart.exclude屬性來修改默認值瀏覽器

若是你想保留默認配置,並添加一些額外的路徑,可使用spring.devtools.restart.additional-exclude屬性緩存

觀察額外的路徑

若是你想觀察不在classpath中的路徑的文件變化並觸發重啓,則能夠配置 spring.devtools.restart.additional-paths 屬性安全

關閉自動重啓

設置 spring.devtools.restart.enabled 屬性爲false,能夠關閉該特性。能夠在application.properties中設置,也能夠經過設置環境變量的方式app

public static void main(String[] args) {
    System.setProperty("spring.devtools.restart.enabled", "false");
    SpringApplication.run(MyApp.class, args);
}

使用一個觸發文件

經過設置spring.devtools.restart.trigger-file屬性指定一個文件,當該文件被修改時,則觸發自動重啓

自定義自動重啓類加載器

Spring Boot自動重啓使用的是兩個類加載器,大多數狀況下工做良好,有時候會出現問題。

默認的,IDE中打開的項目會使用 restart 類加載器進行加載,而任何其餘的 .jar 文件會使用 base 類加載器進行加載。若是你使用的是多模塊的項目,而且有些模塊沒有被導入到IDE,你須要建立並編輯META-INF/spring-devtools.properties文件來自定義一些配置

spring-devtools.properties文件包含有 restart.exclude. 和 restart.include. 前綴的屬性。include屬性文件的都會被加入到restart類加載器,exclude屬性文件的都會被加入到base類加載器,他們的值是正則表達式,全部的屬性值必須是惟一的

例如:

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

classpath中的全部META-INF/spring-devtools.properties文件都會被加載。

已知的限制

若是對象是使用ObjectInputStream進行反序列化,則自動重啓將不可用。若是你須要反序列化對象,則你須要使用spring的ConfigurableObjectInputStream並配合Thread.currentThread().getContextClassLoader()進行反序列化

三、LiveReload

在瀏覽器方面,DevTools內置了一個LiveReload服務,能夠自動刷新瀏覽器。若是你使用JRebel,則自動重啓將會失效,取而代之的是使用動態加載類文件。固然,其餘的DevTools(例如LiveReload和屬性覆蓋)特性還能使用。

該特性能夠經過spring.devtools.livereload.enabled屬性來設置是否開啓

四、全局設置

能夠在 $HOME 目錄下建立一個.spring-boot-devtools.properties文件來設置全局的配置。

例如,設置一個觸發文件類觸發重啓:

spring.devtools.reload.trigger-file=.reloadtrigger

五、遠程應用

DevTools不只能夠用於本地應用,也能夠用於遠程應用。經過設置 spring.devtools.remote.secret 屬性能夠開啓遠程應用。

遠程DevTools支持包括兩個部分,服務端應用和你IDE中運行的本地客戶端應用。當設置spring.devtools.remote.secret屬性以後,服務端應用自動開啓DevTools特性,客戶端程序須要手動啓動。

運行遠程客戶端應用

遠程客戶端應用被設計來運行在你的IDE中。你須要使用和你鏈接的遠程應用相同的classpath來運行org.springframework.boot.devtools.RemoteSpringApplication類,傳遞給該類的必選參數是你鏈接的應用的url。

例如,若是你在使用Eclipse或者STS,而且你有一個 my-app 應用部署在Cloud Foundry,你能夠按照如下步驟操做:

  • 從Run菜單運行Run Configurations…`
  • 建立一個Java Application的啓動配置
  • 瀏覽my-app項目
  • 使用org.springframework.boot.devtools.RemoteSpringApplication做爲main類
  • 添加https://myapp.cfapps.io到the Program arguments

一個運行中的遠程客戶端將會是這樣子:

.   ____          _                                              __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _          ___               _      \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` |        | _ \___ _ __  ___| |_ ___ \ \ \ \
 \\/  ___)| |_)| | | | | || (_| []::::::[]   / -_) '  \/ _ \  _/ -_) ) ) ) )
  '  |____| .__|_| |_|_| |_\__, |        |_|_\___|_|_|_\___/\__\___|/ / / /
 =========|_|==============|___/===================================/_/_/_/
 :: Spring Boot Remote :: 1.3.2.RELEASE

2015-06-10 18:25:06.632  INFO 14938 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Starting RemoteSpringApplication on pwmbp with PID 14938 (/Users/pwebb/projects/spring-boot/code/spring-boot-devtools/target/classes started by pwebb in /Users/pwebb/projects/spring-boot/code/spring-boot-samples/spring-boot-sample-devtools)
2015-06-10 18:25:06.671  INFO 14938 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2a17b7b6: startup date [Wed Jun 10 18:25:06 PDT 2015]; root of context hierarchy
2015-06-10 18:25:07.043  WARN 14938 --- [           main] o.s.b.d.r.c.RemoteClientConfiguration    : The connection to http://localhost:8080 is insecure. You should use a URL starting with 'https://'.
2015-06-10 18:25:07.074  INFO 14938 --- [           main] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2015-06-10 18:25:07.130  INFO 14938 --- [           main] o.s.b.devtools.RemoteSpringApplication   : Started RemoteSpringApplication in 0.74 seconds (JVM running for 1.105)

說明:

  • 由於遠程客戶端和遠程應用使用的是相同的classpath,因此遠程客戶端能夠直接讀取應用的配置文件。因此spring.devtools.remote.secret屬性可以被讀取到並傳遞給服務端進行校驗。
  • 遠程url建議使用更加安全的https://協議
  • 若是須要使用代理,則須要設置spring.devtools.remote.proxy.hostspring.devtools.remote.proxy.port屬性。

遠程更新

遠程客戶端會監控你的應用的classpath的改變和本地重啓的方式同樣。任何更新的資源將會被推送到遠程應用而且(若是有必要)觸發一個重啓。這在你集成一個使用雲服務的本地不存在的特性時會是很是有用的。一般遠程的更新和重啓比一個完整的從新編譯和部署週期會快的多。

只有在遠程客戶端運行的過程當中,文件纔會被監控。若是你在啓動遠程客戶端以前,修改一個文件,其將不會被推送到遠程應用。

遠程調試

遠程調試默認使用的端口是8000,你能夠經過spring.devtools.remote.debug.local-port來修改。

你能夠經過查看JAVA_OPTS來看遠程調試是否被啓用,主要是觀察是否有-Xdebug -Xrunjdwp:server=y,transport=dt_socket,suspend=n參數

在這裏插入圖片描述 QQ討論羣組:984370849 706564342 歡迎加入討論

想要深刻學習的同窗們能夠加入QQ羣討論,有全套資源分享,經驗探討,沒錯,咱們等着你,分享互相的故事! 在這裏插入圖片描述

相關文章
相關標籤/搜索