Developer Tools
spring-boot-devtools 是一個(gè)為開發(fā)者服務(wù)的一個(gè)模塊踱蛀,其中最重要的功能就是自動(dòng)應(yīng)用代碼更改到最新的App上面去摘昌,即在我們改變了一些代碼或者配置文件的時(shí)候氯材,應(yīng)用可以自動(dòng)重啟迫摔,這在我們開發(fā)的時(shí)候轴踱,非常有用埃元。
要包含devtools支持涝涤,需要將spring-boot-devtools模塊依賴添加到項(xiàng)目構(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")
}
在運(yùn)行完全打包的應(yīng)用程序時(shí),開發(fā)工具會(huì)自動(dòng)被禁用岛杀,如果您的應(yīng)用程序是從java -jar啟動(dòng)的阔拳,或者是從一個(gè)特殊的類加載器開始的,那么它就被認(rèn)為是一個(gè)“生產(chǎn)應(yīng)用程序”类嗤。將依賴項(xiàng)標(biāo)記為Maven中的可選項(xiàng)
<optional>true</optional>
或在Gradle中使用compileOnly
是一種最佳實(shí)踐糊肠,它可以防止devtools被傳遞到其他使用你的項(xiàng)目的模塊中。
屬性默認(rèn)值 Property Defaults
Spring Boot支持的一些庫使用緩存來提高性能遗锣。例如货裹,模板引擎緩存已編譯的模板以避免重復(fù)解析模板文件。另外黄伊,Spring MVC可以在服務(wù)靜態(tài)資源時(shí)將HTTP緩存頭添加到響應(yīng)中泪酱。
雖然緩存在生產(chǎn)中非常有用,但它在開發(fā)過程中會(huì)起到反作用还最,使我們無法看到在應(yīng)用程序中所做的更改墓阀。因此,spring-boot-devtools默認(rèn)禁用緩存選項(xiàng)拓轻。
緩存選項(xiàng)通常由application.properties文件中的設(shè)置進(jìn)行配置斯撮。例如,如要禁用Thymeleaf的緩存功能可以配置spring.thymeleaf.cache為false扶叉。引入spring-boot-devtools模塊后不需要手動(dòng)設(shè)置這些屬性勿锅,spring-boot自動(dòng)應(yīng)用合理的開發(fā)時(shí)配置帕膜。
有關(guān)devtools自動(dòng)應(yīng)用的屬性的完整列表,可參閱DevToolsPropertyDefaultsPostProcessor
以下是DevToolsPropertyDefaultsPostProcessor的部分源碼:
@Order(Ordered.LOWEST_PRECEDENCE)
public class DevToolsPropertyDefaultsPostProcessor implements EnvironmentPostProcessor {
private static final Map<String, Object> PROPERTIES;
static {
Map<String, Object> devToolsProperties = new HashMap<>();
devToolsProperties.put("spring.thymeleaf.cache", "false");
devToolsProperties.put("spring.freemarker.cache", "false");
devToolsProperties.put("spring.groovy.template.cache", "false");
devToolsProperties.put("spring.mustache.cache", "false");
devToolsProperties.put("server.servlet.session.persistent", "true");
devToolsProperties.put("spring.h2.console.enabled", "true");
devToolsProperties.put("spring.resources.cache.period", "0");
devToolsProperties.put("spring.resources.chain.cache", "false");
devToolsProperties.put("spring.template.provider.cache", "false");
devToolsProperties.put("spring.mvc.log-resolved-exception", "true");
devToolsProperties.put("server.servlet.jsp.init-parameters.development", "true");
devToolsProperties.put("spring.reactor.stacktrace-mode.enabled", "true");
PROPERTIES = Collections.unmodifiableMap(devToolsProperties);
}
自動(dòng)重啟
使用spring-boot-devtools
的應(yīng)用程序在類路徑更改時(shí)自動(dòng)重新啟動(dòng)溢十。當(dāng)在IDE中工作時(shí)垮刹,這可能是一個(gè)有用的特性,因?yàn)樗鼮榇a更改提供了非痴懦冢快速的反饋循環(huán)荒典。默認(rèn)情況下,指向一個(gè)文件夾的類路徑上的任何條目都會(huì)被監(jiān)控以進(jìn)行更改吞鸭。請(qǐng)注意寺董,某些資源(如靜態(tài)資產(chǎn)和視圖模板)不需要重新啟動(dòng)應(yīng)用程序
觸發(fā)重啟
由于DevTools監(jiān)控類路徑資源,觸發(fā)重啟的唯一方法是更新類路徑刻剥。導(dǎo)致類路徑更新的方式取決于您使用的IDE遮咖。在Eclipse中,保存修改后的文件會(huì)導(dǎo)致更新類路徑并觸發(fā)重新啟動(dòng)造虏。在IntelliJ IDEA中御吞,構(gòu)建項(xiàng)目(Build -> Build Project)具有相同的效果
實(shí)際開發(fā)中不可能每次改動(dòng)后都手動(dòng)Build,因此需要設(shè)置Idea的自動(dòng)編譯酗电。
win魄藕、linux版本Idea設(shè)置
File --> Settings --> Compiler --> Build Project automatically
ctrl + shift + alt + / --> Registry --> 勾選Compiler autoMake allow when app running
mac版本Idea設(shè)置(步驟一樣,只是快捷鍵不同而已)
IntelliJ IDEA --> Preferences(快捷鍵Command+,) --> Compiler --> Build Project automatically
option+shift+command+/ --> Registry --> 勾選Compiler autoMake allow when app running
什么?mac第二個(gè)快捷鍵不知道嫩与?怎么找寝姿?
重新啟動(dòng)和重新加載
Spring Boot提供的重啟技術(shù)使用兩個(gè)類加載器。不改變的類(例如划滋,來自第三方j(luò)ar的類)被加載到一個(gè)基類加載器中饵筑,正在積極開發(fā)的類被加載到重啟類加載器中,當(dāng)應(yīng)用程序重新啟動(dòng)時(shí)处坪,重啟類加載器將被丟棄根资,并創(chuàng)建一個(gè)新的類加載器。這種方法意味著應(yīng)用程序重新啟動(dòng)通常要比“冷啟動(dòng)”快得多同窘,因?yàn)榛惣虞d器已經(jīng)可用并填充了玄帕。
如果發(fā)現(xiàn)重新啟動(dòng)對(duì)應(yīng)用程序來說不夠快,或者遇到了類加載問題想邦,你可以考慮重新加載技術(shù)裤纹,如零周轉(zhuǎn)期的JRebel,這些工作通過在加載類時(shí)重寫類丧没,使它們更易于重新加載鹰椒。
排除的資源 Excluding Resources
某些資源不一定需要在更改時(shí)觸發(fā)重新啟動(dòng)锡移。例如,可以就地編輯Thymeleaf模板漆际。默認(rèn)情況下淆珊,改變/META-INF/maven,/META-INF/resources奸汇,/resources套蒂,/static,/public茫蛹,或 /templates路徑下的資源不會(huì)觸發(fā)重啟但會(huì)觸發(fā) 重新加載∷感可以使用spring.devtools.restart.exclude屬性來自定義排除的資源婴洼。例如,要僅排除/static撼嗓,/public可以設(shè)置以下屬性:
spring.devtools.restart.exclude=static/**,public/**
If you want to keep those defaults and add additional exclusions, use the
spring.devtools.restart.additional-exclude
property instead.
偵聽其他路徑 Watching Additional Paths
你可能想在你修改不在類路徑下的文件時(shí)讓你的應(yīng)用觸發(fā)重新啟動(dòng)或重新加載柬采。要做到這點(diǎn),可以使用spring.devtools.restart.additional-paths
屬性來配置需要額外監(jiān)控的路徑且警。您可以使用前面描述的spring.devtools.restart.exclude
屬性 來控制其他路徑下的更改是否會(huì)觸發(fā)完全重新啟動(dòng)或 實(shí)時(shí)重新加載粉捻。
禁用重啟
如果你不想使用重新啟動(dòng)功能,則可以使用該spring.devtools.restart.enabled屬性將其禁用 斑芜。在大多數(shù)情況下肩刃,你可以在application.properties設(shè)置這個(gè)屬性(這樣做仍然可以初始化重啟類加載器,但它不會(huì)監(jiān)視文件的變化)杏头。
如果您需要完全禁用重新啟動(dòng)支持(例如盈包,因?yàn)樗贿m用于特定的庫),則需要在調(diào)用SpringApplication.run(…?)
之前將spring.devtools.restart.enabled
System
屬性設(shè)置為false
醇王,如下例所示:
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
完整devtools特性請(qǐng)參考官方文檔
https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-restart-disable
Spring Loaded
Spring Boot項(xiàng)目熱部署方式還有一種就是使用spring loaded呢燥。
在spring-boot-maven-plugin中添加springloaded依賴
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.6.RELEASE</version>
</dependency>
</dependencies>
</plugin>
項(xiàng)目以mvn spring-boot:run方式啟動(dòng)即可完成熱部署
再就是不添加依賴,直接將springloaded jar包下載下來寓娩,然后以java應(yīng)用方式啟動(dòng)叛氨,只不過要配置一下Run Configuration將VM options配置為-javaagent:C:springloaded-1.2.6.RELEASE.jar -noverify(其中C:springloaded-1.2.6.RELEASE.jar為你自己jar所在位置)