本文翻譯自:http://docs.spring.io/spring-boot/docs/2.0.0.M2/reference/htmlsingle/
19.1 從IDE中啟動SpringBoot
你能從你的IDE中,將一個SpringBoot應用作為一個簡單的java應用啟動。然而,首先你要導入你的項目。導入步驟將會非常依賴你的IDE和構(gòu)建系統(tǒng)。大多數(shù)的IDE能直接導入MAVEN項目,比如Eclipse能從你的File菜單選擇 Import... -> Existing Maven Projects 。
如果你不能直接導入你的項目到IDE中,你也許能夠構(gòu)建插件生成IDE元數(shù)據(jù)。Maven包含了Eclipse和IDEA的插件。
注意:如果你偶然運行了一個web應用兩次,你將會看到“Port alread in use”錯誤。STS用戶能使用Relaunch按鈕來代替Run,確認你存在的web實例已經(jīng)關(guān)閉。
19.2 從打包應用來啟動SpringBoot
如果你使用SpringBoot Maven 或者 Gradle插件來創(chuàng)建一個可執(zhí)行的jar,你能使用java -jar命令來啟動你的應用。比如:
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar
也可以運行打包的應用程序,啟動遠程調(diào)試支持。這允許你將debugger程序附加到打包的應用程序中:
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar target/myproject-0.0.1-SNAPSHOT.jar
19.3 從MAVEN插件來運行SpringBoot
SpringBoot的MAVEN插件包含一個快速編譯和快速運行的run命令。像在IDE中運行開放式應用程序一樣。
$ mvn spring-boot:run
你也可以使用可用的操作系統(tǒng)環(huán)境變量
$ export MAVEN_OPTS=-Xmx1024m
19.4 從Gradle插件來運行SpringBoot
SpringBoot的Gradle插件也包含了運行你的開放式結(jié)構(gòu)應用的bootRun命令。每當運行org.springframework.boot和java插件,都會添加bootRun任務。
$ gradle bootRun
你也可以使用可用的操作系統(tǒng)環(huán)境變量
$ export JAVA_OPTS=-Xmx1024m
19.5 使用Hot swapping來運行你的SpringBoot
當SpringBoot應用只是一個JAVA的應用程序。JVM hot swapping應該是開箱即用的。JVM hot swapping 在可替代字節(jié)碼方面有些限制,為了更完整的解決方案可以使用JRebel(一種正對java的熱部署技術(shù))。spring-boot-devtools模塊也支持應用快速重啟。
20 開發(fā)工具
SpringBoot包含一組額外的開發(fā)工具,能提供愉快的開發(fā)經(jīng)驗。spring-boot-devtools模塊可以包含在任何項目中,已提供額外的開發(fā)時間功能。為了包含開發(fā)工具支持,在你的構(gòu)建中簡單的加入依賴:
Maven
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
Gradle
dependencies {
compile("org.springframework.boot:spring-boot-devtools")
}
注意:開發(fā)工具(Developer tools)在你運行完整打包項目的時候是會自動禁止的。如果你的應用是用java -jar啟動,或者使用特殊的classloader啟動,會被springboot認為是一個“生產(chǎn)應用”。標記依賴防止使用您的項目將devtools是可選的是最好的嘗試。Gradle不支持可選依賴,所以你應該同時查看propdeps-plugin
注意:默認重新歸檔打包不包含devtools。如果你想使用某些遠程功能,你將會需要禁用excludeDevtools屬性,才能包含devtools。這個屬性同時支持Maven和Gradle
20.1 默認屬性值
通過SpringBoot支持的一些包,使用緩存來提高性能。比如,模板引擎會緩存編譯好的模板來避免重新解析模板文件。還有,當請求靜態(tài)資源,Spring MVC能添加http的緩存頭來響應。
緩存在生產(chǎn)中非常有益,在開發(fā)過程中可能會造成反效果,阻止你看到在應用中剛剛作出的更改。因為這個原因,spring-boot-devtools默認是禁用緩存選項。
緩存選項通常在application.properties文件中配置。比如,在Thymeleaf提供的spring.thymeleaf.cache屬性。對比需要手動設置值,spring-boot-devtools模塊將會自動應用明智的開發(fā)環(huán)境配置。
注意:完整的屬性列表在DevToolsPropertyDefaultsPostProcessor中查看
20.2 自動重啟
應用使用spring-boot-devtools將會自動重啟,當文件在classpath中發(fā)生變化時。在使用IDE開發(fā)的時候,會針對代碼改變,給出一個快速的反饋循環(huán),這是很有用的功能。默認地,任何classpath中的條目都會被標記成文件夾,來監(jiān)控他的改變。注意確認資源,比如靜態(tài)assets和view模板,不需要重啟應用。
觸發(fā)重啟
Devtools監(jiān)控的classpath資源,只有更新classpath一個方法觸發(fā)重啟。導致類路徑更新的方法取決于你的IDE。在eclipse,保存一個改變的文件,類路徑更新導致應用重啟。在IDEA中,使用Build -> Make Project 來獲得相同的效果。
只要派生可用,你也可以通過支持構(gòu)建插件(比如Maven和Gradle)啟動你的應用,因為DevTools需要一個孤立的應用加載器才能正常操作。當探測到DevTools在類路徑中,Gradle和Maven默認會這么做。
當使用LiveReload時,自動重啟工作非常友好。如果你使用JRebel,在動態(tài)加載類的時候自動重啟會禁用。其他的devtools特性任然會有用(比如LiveReload,屬性重載)。
重啟的時候,在應用上下文中Devtools依賴的關(guān)閉鉤子是不可用的。當然如果你禁用關(guān)閉鉤子,那他也不會發(fā)生作用(SpringApplication.setRegisterShutdownHook(false))。
當類路徑的條目發(fā)生改變會導致觸發(fā)重啟,DevTools自動忽略以下命名的項目,sping-boot,spring-boot-devtools,spring-boot-autoconfigure,spring-boot-actuator和spring-boot-starter。
Devtools能通過ApplicationContext來定制ResourceLoader:如果你的應用已經(jīng)提供了一個加載器,他將會與其捆綁。在ApplicationContext中直接復寫getResource方法是不被支持的。
重啟 VS 重載
重啟技術(shù)是spring boot提供兩個加載器來實現(xiàn)的。不變的類(比如,第三方的jar包)載入到基礎的加載器中?;顒拥念惣虞d到重啟加載器中。當應用重啟,重啟加載器被丟棄,并且一個新的類加載器會被創(chuàng)建。這種做法意味著應用重啟比直接重新啟動應用要快,因為基礎加載器已經(jīng)處于可用的狀態(tài)。
如果你發(fā)現(xiàn)你的應用重啟沒有足夠快,或者遭遇類加載的問題,你應該考慮重載技術(shù),比如JRebel。他們在重載類時通過重寫類,使其更適合重新加載。
20.2.1 排除資源
有些資源在改變時不需要重啟。比如,Thymeleaf模板的即時編輯。默認以下的路徑中的文件改變不會觸發(fā)重啟應用,但會觸發(fā)重載資源,他們是/META-INF/maven, /META-INF/resources ,/resources ,/static ,/public or /templates。如果你想定制路徑,可以使用spring.devtools.restart.exclude屬性。比如只包含/static路徑和/public路徑,可以像下面一樣設定:
spring.devtools.restart.exclude=static/**,public/**
20.2.2 監(jiān)視額外的路徑
你也許在你改變的文件不在classpath路徑下,你想讓你的應用重啟或重載資源。這樣,使用spring.devtools.restart.additional-paths屬性配置額外的路徑來監(jiān)控改變。您可以使用上述的spring.devtools.restart.exclude屬性來控制附加路徑下的更改是否會觸發(fā)完全重新啟動或只是實時重新加載。
20.2.3 禁用重啟
如果你不想使用重啟特性,你能使用spirng.devtools.restart.enabled屬性來禁用。大多數(shù)情況下,你能在你的application.properties設定這些值(仍然會初始化重啟類加載器,但是不會監(jiān)控文件的變化)。
如果你需要完全禁用重啟功能,比如,因為一個特殊的jar不工作,你需要在調(diào)用SpringApplication.run()之前設定這個System屬性。比如:
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
20.2.4 使用觸發(fā)文件
如果你的IDE一直頻繁地編譯改變了的文件,你也許更傾向于在一個特殊的時間點觸發(fā)重啟。你可以使用觸發(fā)文件,這是一個特殊文件,當你確實想要觸發(fā)重啟檢查時,必須修改他。更改文件只會觸發(fā)檢查,重啟需要在Devtools檢查到某些必須執(zhí)行的操作。觸發(fā)文件可以手動更新,或使用IDE插件。
使用spring.devtools.restart.trigger-file屬性來穹頂觸發(fā)文件
20.2.5 定制重啟類加載器
如上面重啟VS重載部分所述,重啟功能是通過使用兩個類加載器來實現(xiàn)的。對于大多數(shù)的應用,這能很好地工作,然而,有時候會出現(xiàn)類加載的問題。
默認地,在IDE中打開任何項目都將加載restart類加載器,任何規(guī)范的jar包將會被所謂的base來加載器加載。如果你運行多個工程,不是每個模塊都導入你的IDE,你也許需要定制一些參數(shù)。創(chuàng)建META-INF/spring-devtools.properties文件。
spring-devtools.properties文件包含restart.exclude.和restart.include.前綴熟悉。include元素是應該被拉到重啟類加載器。exclude元素是應該被拉到基礎類加載器。屬性值會通過正則表達式匹配classpath。
比如:
restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
注意:所有屬性鍵必須是唯一的。只要屬性是restart.include 或 restart.exclude開頭的。這是值得注意的。
20.2.6 已知的限制
在對象使用一個標準ObjectInputStream反序列化時,重啟功能不會運行的很好。如果你需要反序列化數(shù)據(jù),你也許需要使用Spring的ConfigurableObjectInputStream和Thread.currentThread().getContextClassLoader()結(jié)合使用。
很不幸,第三方框架的反序列化不在context classloader的考慮范圍之內(nèi)。如果你發(fā)現(xiàn)這個問題,你會需要向框架的原始作者請求一個fix。