本文主要了解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()
進行反序列化
在瀏覽器方面,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,你能夠按照如下步驟操做:
一個運行中的遠程客戶端將會是這樣子:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \ \\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) ) ' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / / =========|_|==============|___/===================================/_/_/_/ :: 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)
說明:
spring.devtools.remote.proxy.host
和spring.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羣討論,有全套資源分享,經驗探討,沒錯,咱們等着你,分享互相的故事!