Spring Boot 1.3引入了一組新的開發(fā)者工具,可以讓你在開發(fā)時更方便地使用Spring Boot,包括如下功能。
- 自動重啟:當Classpath里的文件發(fā)生變化時,自動重啟運行中的應用程序。
- LiveReload支持:對資源的修改自動觸發(fā)瀏覽器刷新。
- 遠程開發(fā):遠程部署時支持自動重啟和LiveReload。
- 默認的開發(fā)時屬性值:為一些屬性提供有意義的默認開發(fā)時屬性值。
Spring Boot的開發(fā)者工具采取了庫的形式,可以作為依賴加入項目。如果你使用Gradle來構建項目,可以像下面這樣在build.gradle文件里添加開發(fā)工具:
compile "org.springframework.boot:spring-boot-devtools"
在Maven POM里添加<dependency>是這樣的:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
當應用程序以完整打包好的JAR或WAR文件形式運行時,開發(fā)者工具會被禁用,所以沒有必要在構建生產部署包前移除這個依賴。
一、自動重啟
在激活了開發(fā)者工具后,Classpath里對文件做任何修改都會觸發(fā)應用程序重啟。為了讓重啟速度夠快,不會修改的類(比如第三方JAR文件里的類)都加載到了基礎類加載器里,而應用程序的代碼則會加載到一個單獨的重啟類加載器里。檢測到變更時,只有重啟類加載器重啟。
有些Classpath里的資源變更后不需要重啟應用程序。像Thymeleaf這樣的視圖模板可以直接編輯,不用重啟應用程序。在/static或/public里的靜態(tài)資源也不用重啟應用程序,所以Spring Boot 開發(fā)者工具會在重啟時排除掉如下目錄:/META-INF/resources、/resources、/static、/public和 /templates。
可以設置spring.devtools.restart.exclude屬性來覆蓋默認的重啟排除目錄。例如,你只排除/static和/templates目錄,可以像這樣設置spring.devtools.restart. exclude:
spring: devtools: restart: exclude: /static/**,/templates/**
另一方面,如果想徹底關閉自動重啟,可以將spring.devtools.restart.enabled設置為false:
spring: devtools: restart: enabled: false
另外,還可以設置一個觸發(fā)文件,必須修改這個文件才能觸發(fā)重啟。例如,在修改為.trigger 的文件前你都不希望執(zhí)行重啟,那么你只需像這樣設置spring.devtools.restart.trigger-file屬性:
spring: devtools: restart: trigger-file: .trigger
如果你的IDE會連續(xù)編譯修改的文件,那觸發(fā)文件還是很有用的。沒有觸發(fā)文件的話,每次變更都會觸發(fā)重啟。有觸發(fā)文件,就能保證只有你想重啟時才會發(fā)生重啟(修改觸發(fā)文件即可)。
二、LiveReload
在Web應用程序開發(fā)過程中,最常見的步驟大致如下:
- 修改要呈現(xiàn)的內容(比如圖片、樣式表、模板)。
- 點擊瀏覽器里的刷新按鈕,查看修改的結果。
- 回到第1步。
雖然這并不難,但如果能不點刷新就直接看到修改結果,那豈不是更好?
Spring Boot的開發(fā)者工具集成了LiveReload(http://livereload.com),可以消除刷新的步驟。激活開發(fā)者工具后,Spring Boot會啟動一個內嵌的LiveReload服務器,在資源文件變化時會觸發(fā)瀏覽器刷新。你要做的就是在瀏覽器里安裝LiveReload插件。
如果想要禁用內嵌的 LiveReload 服務器,可以將 spring.devtools.livereload. enabled設置為false:
spring: devtools: livereload: enabled: false
三、遠程開發(fā)
在遠程運行應用程序時(比如部署到服務器上或云上),開發(fā)者工具的自動重啟和LiveReload特性都是可選的。此外,Spring Boot開發(fā)者工具還能遠程調試Spring Boot應用程序。
在傳統(tǒng)的開發(fā)過程中,你不會打開遠程開發(fā)功能,因為這會影響性能。但在一些特殊的場景中,此類工具就很有用。比如,出于開發(fā)目的,所開發(fā)的應用程序部署在非生產環(huán)境里。如果應用程序不是在本地開發(fā)環(huán)境里,而是在云端部署,則尤其如此。
你必須設置一個遠程安全碼來開啟遠程開發(fā)功能:
spring: devtools: remote: secret: myappsecret
有了這個屬性后,運行中的應用程序就會啟動一個服務器組件以支持遠程開發(fā)。它會監(jiān)聽接受變更的請求,可以重啟應用程序或者觸發(fā)瀏覽器刷新。
為了使用這個遠程服務器,你需要在本地運行遠程開發(fā)工具的客戶端。這個遠程客戶端是一個類,全限定類名是org.springframework.boot.devtools.RemoteSpringApplication。它會運行在IDE里,要求提供一個參數(shù),告知遠程應用程序部署在哪里。
例如,假設你正遠程運行閱讀列表應用程序,部署在 Cloud Foundry 上,地址是 https://readinglist.cfapps.io。如果你正在使用Eclipse或Spring ToolSuite,可以通過如下步驟開啟遠程客戶端。
- 選擇Run > Run Configurations菜單項。
- 創(chuàng)建一個新的Java Application運行配置。
- 在Project里選中Reading List項目(可以鍵入項目名或者點擊Browse按鈕找到這個項目,見圖A-1)。
- 在Main Class里鍵入org.springframework.boot.devtools.RemoteSpringAppli-cation(見圖A-1)。
- 切換到Arguments標簽頁,在Program Arguments里鍵入https://readinglist.cfapps. io(見圖A-2)。
圖A-1 RemoteSpringApplication是遠程開發(fā)者工具客戶端
圖A-2 RemoteSpringApplication將遠程應用程序的URL作為參數(shù)
客戶端啟動后,就可以在IDE里修改應用程序了。在檢測到變動后,這些修改點會被推送到遠端并加以應用。如果修改的內容涉及呈現(xiàn)的Web資源(比如樣式表或JavaScript),LiveReload 還會觸發(fā)瀏覽器刷新。
遠程客戶端還會開啟基于HTTP的遠程調試通道,這樣就能在IDE里調試部署在遠程的應用程序了。你要做的就是確保遠程應用程序打開了遠程調試功能。這通常可以通過配置JAVA_OPTS來實現(xiàn)。
比方說,你的應用程序部署在Cloud Foundry上,可以像下面這樣在應用程序的manifest.yml里設置JAVA_OPTS。
--- env: JAVA_OPTS: "-Xdebug -Xrunjdwp:server=y,transport=dt_socket,suspend=n"
遠程應用程序啟動后,會和本地調試服務器建立一個連接。你可以設置斷點,一步步執(zhí)行遠程應用程序里的代碼,就好像它們運行在本地一樣(出于網(wǎng)絡原因,速度會有點慢)。
四、默認的開發(fā)時屬性
有些配置屬性通常在開發(fā)時設置,從來不用在生產環(huán)境里。比如視圖模板緩存,在開發(fā)時最好關掉,這樣你可以立刻看到修改的結果。但在生產環(huán)境里,為了追求更好的性能,應該開啟視圖模版緩存。
默認情況下,Spring Boot會為其支持的各種視圖模板(Thymeleaf、Freemarker、Velocity、Mustache和Groovy模板)開啟緩存選項。但如果存在Spring Boot的開發(fā)者工具,這些緩存就會禁用。
實際上,這就是說在開發(fā)者工具激活后,如下屬性會設置為false:
- spring.thymeleaf.cache
- spring.freemarker.cache
- spring.velocity.cache
- spring.mustache.cache
- spring.groovy.template.cache
這樣一來,就不用在開發(fā)時(在一個開發(fā)時使用的Profile配置里)禁用它們了。
五、全局配置開發(fā)者工具
你應該已經注意到了,在使用開發(fā)者工具時,你通常會在多個項目里使用相同的設置。舉個例子,如果你使用了重啟觸發(fā)文件,那么你很可能在多個項目里都使用相同的觸發(fā)文件名。相比在每個項目里重復開發(fā)者工具配置,對開發(fā)者工具做全局配置顯得更方便一些。
要實現(xiàn)這個目的,可以在你的主目錄(home directory)里創(chuàng)建一個名為.spring-boot-devtools. properties的文件。(請注意,文件名用“.”開頭。)在那個文件里,你可以設置希望在多個項目里共享的各種開發(fā)者工具屬性。
例如,假設你想把觸發(fā)文件的名稱設置為.trigger,在所有Spring Boot項目里禁用LiveReload。你可以創(chuàng)建一個.spring-boot-devtools.properties文件,包含如下內容:
spring.devtools.restart.trigger-file=.trigger spring.devtools.livereload.enabled=false
要是你想覆蓋這些配置,可以在每個項目的application.properties或application.yml文件里設置特定于每個項目的屬性。
版權聲明:本文內容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權/違法違規(guī)的內容, 請發(fā)送郵件至 舉報,一經查實,本站將立刻刪除。