天天看點

開發者工具

        springboot包含了一套額外的工具集,可以讓開發的過程更加愉快。spring-boot-devtools子產品可以在任何工程中被添加,以支援一些額外的開發時特性。在建構時添加子產品的依賴,這樣項目就支援了開發者工具集,maven和gradle的示例如下:

<dependencies>

<dependency>

<groupid>org.springframework.boot</groupid>

<artifactid>spring-boot-devtools</artifactid>

<optional>true</optional>

</dependency>

</dependencies>

configurations {

developmentonly

runtimeclasspath {

extendsfrom developmentonly

}

dependencies {

developmentonly("org.springframework.boot:spring-boot-devtools")

注意:         運作一個完全打包的程式時會自動禁用開發者工具,如果你得程式通過java -jar或者通過一個特殊的類加載器啟動,則會被認為是一個“生産”程式(會禁用開發者工具集)。如果這個對你不适用(你是通過容器啟動的程式),可以考慮排除開發者工具或者設定程式的配置-dspring.devtools.restart.enabled=false。 提示:         在maven中标記依賴為可選或者在gradle中設定自定義屬性“僅開發”(如上所示),可以很好的避免過度的在你得項目其他子產品應用開發工具。         預設情況,打包的檔案中不包含開發工具,如果想遠端的使用一些開發工具的功能,可以在建構屬性值時禁用excludedevtools來包含開發工具,這個屬性maven和gradle都支援。

20.1 屬性預設值

        springboot支援一些庫使用緩存來提高性能。例如模闆引擎可以緩存已編譯的模闆,避免對模闆的反複解析。springmvc還可以将http的頭檔案添加到緩存中,這樣當通路靜态資源時可以快速響應。

        雖然緩存在生産環境效果顯著,但是在開發時可能産生相反的效果,當你對程式進行更改後緩存機制會導緻不會及時的重新整理更改。由于這個的原因,springboot開發工具會預設的禁用緩存。

        通常來說,緩存選項的設定在你的application.properties檔案中,開發者工具會自動得配置最優得開發時選項,而不是需要你手動得去設定。

        由于在開發springmvc或spring webflux程式時,我們需要看到更多得web請求資訊,是以開發者工具會開啟web日志組得調試日志功能。這個功能可以讓你看到包括請求資訊、正在處理請求得程式以及相應結果等資訊。如果你需要對所有的資訊(包括一些敏感得資訊)記錄日志,可以将spring.http.log-request-details屬性打開。

        如果你不想要自動的應用預設配置,可以将application.properties檔案中的spring.devtools.addproperties屬性設為false。

20.2 自動重新開機

        開發者工具會在任意在類路徑内的檔案有變化時自動重新開機系統,這個功能在使用ide工具時非常有用,因為它可以快速的回報代碼更改帶來的變化。預設情況下,任何指向類路徑的檔案都會被監控是否更改。另外注意有些資源的更改不需要重新開機程式,例如靜态資源和試圖模闆。

引發重新開機:         因為開發者螢幕監視的是類路徑下的資源,是以唯一會引起重新開機的是更新了類路徑(下的内容)。如何更新類路徑取決于你使用的是什麼ide工具,例如,eclipse在儲存檔案更改的時候會觸發,而idea在建構項目時(build -> build project)也會觸發更改。         由于開發者工具需要一個獨立的類加載器才能正确運作,是以隻要分支是開啟的,你同樣可以通過受支援的插件(maven或gradle)來啟動程式。當gradle或maven檢測到類路徑下含有開發工具,就會預設這樣做。         自動重新開機和熱加載一起使用往往有更好的效果,具體的細節看“熱加載”部分。如果使用了jrebel,為了支援動态類加載會關閉自動重新開機功能,其他的開發工具功能(如熱加載、屬性覆寫等)依然可以使用。         在重新開機期間開發工具依賴應用上下文的關機鈎子(shutdown hook)來關閉程式,如果關閉了關機鈎子,則開發工具可能不會正确的進行重新開機。(springapplication.setregistershutdownhook(false))         判斷任何一個實體内容發生改變時是否需要重新開機,開發工具會忽略含有spring-boot、spring-boot-devtools、spring-boot-autoconfigure、spring-boot-actuator以及spring-boot-starter名字的檔案。         開發工具需要定制applicationcontext上的resourceloader。如果程式已經提供了一個applicationcontext,開發工具會覆寫applicationcontext,而不會直接重寫applicationcontext上的getresource方法。 “重新開機”或是“重載”         spring boot通過兩個類加載器來提供“重新開機”的技術。不會更改的類(例如第三方jar包裡的類)會被加載進一個“基礎類加載器”,而你正在開發中的類會被加載進一個“重新開機類加載器”。當應用重新開機時,(正在使用的)“重新開機類加載器”會被廢棄掉,一個新的(重新開機類加載器)将會被建立。由于“基礎類加載器”已經是可用狀态,這意味着程式使用這種方式會比“冷啟動”方式更快的重新開機。         如果你發現“重新開機”的速度不能夠滿足程式的需求,或者遇到了類加載問題,可以嘗試使用zeroturnaround公司的jrebel的“重載”技術。這個插件通過重寫class檔案來快速的重載項目。

        預設情況下,每次程式重新開機時,都有一個條件評估增量的報告被記錄。這份報告顯示了你更改的自動配置項如增添/删減的bean,以及設定的配置屬性。

        如果想禁用記錄報告的功能,設定屬性如下:

        某些資源的改變沒有必要觸發重新開機機制,例如thymeleaf模闆的就地編輯等。預設情況下,位于/meta-inf/maven、/meta-inf/resources、/resources、/static、/public和/templates下的檔案發生的更改并不會觸發重新開機機制,不過會觸發重載(live reload)事件。如果你想自定義這些排除項,可以配置spring.devtools.restart.exclude屬性。例如隻想排除/static和/public檔案夾,可以設定如下:

        如果你想在保留這些預設配置的情況下添加額外的排除項,可以在spring.devtools.restart.additional-exclude屬性代替上面的配置。

        如果你想讓“重新開機”機制監視一個不在類路徑下的檔案,即當其改變内容時觸發重新開機,可以通過設定spring.devtools.restart.additional-paths屬性來實作額外的監視路徑。你可以通過上面提到的spring.devtools.restart.exclude屬性來控制額外路徑下檔案内容改變時是進行重新開機還是重載。

        如果你不想使用重新開機功能,可以通過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);

        當你使用ide工具不斷地重新編譯更改的檔案時,你可能更想要在特殊的時間觸發重新開機。為了達到這種效果,你可以使用一個“觸發檔案”,隻有當觸發檔案法生更改時,才會實際的觸發重新開機機制。修改檔案隻會觸發檢查,而隻有devtools認為必要的時候才會進行重新開機。觸發檔案的可以手工修改或是通過ide插件進行修改。

        通過在spring.devtools.restart.trigger-file屬性中設定你的觸發檔案路徑,來使用“觸發檔案”。

        你可能會希望将spring.devtools.restart.trigger-file屬性設定為全局屬性,這樣保證所有的項目保持行為的一緻。

        在上面的“重新開機或重載”部分提到了,“重新開機”是通過兩個類加載器實作的。大部分項目中,這種方式可以很好的工作,然而有時也會導緻類加載異常。

        預設情況下,所有在ide中打開的項目都是通過“重新開機類加載器”加載的,而所有不變的.jar檔案都是通過“基礎類加載器”進行加載的。當你正在開發一個多子產品的應用時,不是每個子產品都會導入進ide中,這時候你需要自定義一些屬性。可以通過建立一個meta-inf/spring-devtools.properties檔案來實作自定義。

        spring-devtools.properties檔案包含了字首為restart.exclude和restart.include的屬性,include屬性中的項目是應該放進“重新開機類加載器”中的,而exclude中的項目是應該放進“基礎類加載器”中的。這個屬性的值應該是一個類路徑的正則表達,示例如下:

restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar

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

        所有屬性的關鍵字必須是唯一的,隻要屬性字首是restart.include.或restart.exclude.就會被認為是自定義項。         所有來自類路徑下的meta-inf/spring-devtools.properties檔案都會被加載,你可以在項目内部中或者項目使用的庫中打封包件。(這句沒看懂)

        當使用标準objectinputstream流反序列化的對象時,重新開機機制不會正常的工作。可以使用spring的configurableobjectinputstream和thread.currentthread().getcontextclassloader()的結合來進行資料的反序列化。

        不幸的是,有些第三方類庫反序列化時沒考慮到使用context classloader,如果你發現了這樣的問題,你需要和類庫的作者聯系修複。

20.3 livereload

        spring-boot-devtools包含了一個嵌入式的livereload伺服器,它可以在資源修改時觸發浏覽器的重新整理。可以在livereload.com中找到chrome、firefox和safari免費的livereload插件。

        如果你不想使用livereload服務,可以設定spring.devtools.livereload.enabled屬性為false。

        在同一時間隻能使用一個livereload服務,在開啟你得程式之前確定沒有其他的livereload服務正在運作。如果你通過ide工具打開了多個項目,隻有第一個項目支援livereload服務。

20.4 全局設定

        你可以通過向$home檔案夾添加名為.spring-boot-devtools.properties的檔案來配置全局devtools設定(請注意,檔案名以“.”開頭)。 添加到此檔案的任何屬性将适用于你的計算機上使用devtools的所有 spring boot應用程式。 例如,要配置重新開機始終使用觸發器檔案 ,你可以在~/.spring-boot-devtools.properties中添加以下内容:

        在.spring-boot-devtools.properties檔案中激活的屬性不會影響profile-specific configuration files的加載。

20.5 遠端應用

        spring boot的開發者工具并不限制于本地開發,在運作遠端程式時也可以使用一些功能。遠端支援是可選擇的,想開啟支援,首先你要确認devtools包含在重打包的文檔中,如下;

<build>

<plugins>

<plugin>

<artifactid>spring-boot-maven-plugin</artifactid>

<configuration>

<excludedevtools>false</excludedevtools>

</configuration>

</plugin>

</plugins>

</build>

        然後如下的配置spring.devtools.remote.secret屬性:

警告:         在一個遠端的應用中啟動spring-boot-devtools是存在安全風險的,不要再生産環境中啟動該支援。

        遠端devtools支援包括兩部分:1.接受連接配接的服務端;2.在ide中運作的用戶端。服務端在設定spring.devtools.remote.secret後自動開啟,用戶端則必須手動開啟。

        遠端用戶端程式是為了在ide中運作而設計的,你需要使用與你連接配接的遠端項目相同的類路徑來運作org.springframework.boot.devtools.remotespringapplication。這個程式需要的唯一的參數就是它連接配接的url。

        例如,當你使用eclipse或sts時,有一個在cloud foundry上的my-app項目,按下面的步驟操作:

在run菜單中選擇run configurations… 

建立一個新的java項目“launch configuration”

浏覽my-app項目

把org.springframework.boot.devtools.remotespringapplication當成main類

添加https://myapp.cfapps.io到程式參數中(或者你得遠端url)

        正在運作的遠端用戶端可能像下面這樣:

. ____ _ __ _ _

/\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \

( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \

\\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) )

' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / /

=========|_|==============|___/===================================/_/_/_/

:: spring boot remote :: 2.1.5.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.secret屬性如何被讀取以及如何通過伺服器驗證的原因。         通常建議使用https://協定進行連接配接,這樣就可以對通信進行加密,密碼也不會被攔截。         如果你需要通過代理通路遠端項目,需要對spring.devtools.remote.proxy.host和spring.devtools.remote.proxy.port屬性進行配置。

        遠端用戶端通過和本地“重新開機”機制相同的方式監視類路徑檔案的變化。任何更新後的檔案會被push進遠端應用并且觸發重新開機(如果需要的話)。如果你使用本地應用沒有的雲服務特性來更新疊代,這将非常有用。通常來說,遠端更新和重新開機比完整的建構部署的周期快很多。

        檔案隻在遠端用戶端開啟的時候會被監控,如果你在遠端用戶端啟動之前改變檔案,則更新不會推送到遠端伺服器上。