SpringBoot學(xué)習(xí)筆記三:devtools與熱部署

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

Win、Linux版本Idea自動(dòng)編譯設(shè)置1

ctrl + shift + alt + / --> Registry --> 勾選Compiler autoMake allow when app running

Win撵术、Linux版本Idea自動(dòng)編譯設(shè)置2
Win背率、Linux版本Idea自動(dòng)編譯設(shè)置3

mac版本Idea設(shè)置(步驟一樣,只是快捷鍵不同而已)

IntelliJ IDEA --> Preferences(快捷鍵Command+,) --> Compiler --> Build Project automatically

Mac版本Idea自動(dòng)編譯設(shè)置1

option+shift+command+/ --> Registry --> 勾選Compiler autoMake allow when app running


Mac版本Idea自動(dòng)編譯設(shè)置2
Mac版本Idea自動(dòng)編譯設(shè)置2

什么?mac第二個(gè)快捷鍵不知道嫩与?怎么找寝姿?

image.png
image.png

重新啟動(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所在位置)


spring loaded設(shè)置
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市棘伴,隨后出現(xiàn)的幾起案子寞埠,更是在濱河造成了極大的恐慌,老刑警劉巖排嫌,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畸裳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡淳地,警方通過查閱死者的電腦和手機(jī)怖糊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門帅容,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伍伤,你說我怎么就攤上這事并徘。” “怎么了扰魂?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵麦乞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我劝评,道長(zhǎng)姐直,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任蒋畜,我火速辦了婚禮声畏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姻成。我一直安慰自己插龄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布科展。 她就那樣靜靜地躺著均牢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪才睹。 梳的紋絲不亂的頭發(fā)上徘跪,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音砂竖,去河邊找鬼真椿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛乎澄,可吹牛的內(nèi)容都是我干的突硝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼置济,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼解恰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起浙于,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤护盈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后羞酗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腐宋,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胸竞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欺嗤。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖卫枝,靈堂內(nèi)的尸體忽然破棺而出煎饼,到底是詐尸還是另有隱情,我是刑警寧澤校赤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布吆玖,位于F島的核電站,受9級(jí)特大地震影響马篮,放射性物質(zhì)發(fā)生泄漏沾乘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一浑测、第九天 我趴在偏房一處隱蔽的房頂上張望意鲸。 院中可真熱鬧,春花似錦尽爆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至夭委,卻和暖如春幅狮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背株灸。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工崇摄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人慌烧。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓逐抑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親屹蚊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子厕氨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容