關(guān)于SpringBoot的熱部署方案
簡(jiǎn)介
說(shuō)明
本文介紹SpringBoot的熱部署方案。
熱部署概述
每次修改代碼就得將項(xiàng)目重啟,重新部署,對(duì)于一些大型應(yīng)用來(lái)說(shuō),重啟時(shí)間需要花費(fèi)大量的時(shí)間成本。目前的 Java 虛擬機(jī)只能實(shí)現(xiàn)方法體的修改熱部署,對(duì)于整個(gè)類(lèi)的結(jié)構(gòu)修改,仍然需要重啟虛擬機(jī),對(duì)類(lèi)重新加載才能完成更新操作。
原理是使用了兩個(gè)ClassLoader,一個(gè)Classloader加載那些不會(huì)改變的類(lèi)(第三方Jar包),另一個(gè)ClassLoader加載會(huì)更改的類(lèi),稱(chēng)為restart ClassLoader。在有代碼更改的時(shí)候,原來(lái)的restart ClassLoader 被丟棄,重新創(chuàng)建一個(gè)restart ClassLoader,由于需要加載的類(lèi)相比較少,所以實(shí)現(xiàn)了較快的重啟時(shí)間。
主要有以下幾種熱部署方式
- spring-boot-devtools(適合開(kāi)發(fā)環(huán)境)
- springloaded(maven插件)配置pom.xml文件,使用mvn spring-boot:run啟動(dòng)
- springloaded本地加載啟動(dòng),配置jvm參數(shù):-javaagent:<jar包地址> -noverify(適合生產(chǎn)環(huán)境)
- JRebel(收費(fèi))
spring-boot-devtools
原理
(1) devtools可以實(shí)現(xiàn)這三種熱部署:頁(yè)面熱部署、類(lèi)文件熱部署(類(lèi)文件修改后不會(huì)立即生效),實(shí)現(xiàn)對(duì)屬性文件的熱部署。 devtools會(huì)監(jiān)聽(tīng)classpath下的文件變動(dòng),并且會(huì)立即重啟應(yīng)用(發(fā)生在保存時(shí)機(jī)),注意:因?yàn)槠洳捎玫奶摂M機(jī)機(jī)制,該項(xiàng)重啟是很快的。
(2)在修改java文件后也就支持了熱啟動(dòng),不過(guò)這種方式是屬于項(xiàng)目重啟(速度比較快的項(xiàng)目重啟),會(huì)清空session中的值,也就是如果有用戶登陸的話,項(xiàng)目重啟后需要重新登陸。 默認(rèn)情況下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public這些文件夾下的文件修改不會(huì)使應(yīng)用重啟,但是會(huì)重新加載(devtools內(nèi)嵌了一個(gè)LiveReload server,當(dāng)資源發(fā)生改變時(shí),瀏覽器刷新)。
使用
1.pom.xml添加依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <version>2.0.4.RELEASE</version> <optional>true</optional> <!-- 這個(gè)需要為 true 熱部署才有效 --> <scope>true</scope> </dependency>
2. pom.xml添加maven插件。(必須配置<fork>true</fork>)
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>${jdk.version}</source> <target>${jdk.version}</target> <!--如果沒(méi)有這個(gè)屬性 springBoot 自動(dòng)配置不會(huì)生效--> <fork>true</fork> </configuration> </plugin> </plugins> </build>
3. 修改application.yml
spring: devtools: restart: enabled: true #開(kāi)啟熱部署 additional-paths: src/main/java #重啟目錄 exclude: WEB-INF/** freemarker: cache: false #頁(yè)面不加載緩存,修改即時(shí)生效
application.properties配置spring.devtools.restart.enabled=false,此時(shí)restart類(lèi)加載器還會(huì)初始化,但不會(huì)監(jiān)視文件更新。 在SprintApplication.run之前調(diào)用System.setProperty(“spring.devtools.restart.enabled”, “false”);可完全關(guān)閉重啟支持,
4. 設(shè)置Idea軟件
File=>Settings=> Builder,Execution,Deployment=> Compiler=> 選中“Build project automaticlly”
ctrl+shift+alt+/ =>選擇registry=>找到 compiler.automake.allow.when.app.running 并?
5.如果使用 Thymeleaf 模板引擎,需要把模板默認(rèn)緩存設(shè)置為 false
修改application.properties為false:
#禁止thymeleaf緩存(建議:開(kāi)發(fā)環(huán)境設(shè)置為false,生產(chǎn)環(huán)境設(shè)置為true ) spring.thymeleaf.cache=false
測(cè)試
- 修改類(lèi)=>保存:應(yīng)用會(huì)重啟
- 修改配置文件=>保存:應(yīng)用會(huì)重啟。例如:application.yml,log4j.yml。若想這些配置文件不熱部署,這樣做:spring.devtools.restart.exclude=application.properties
- 修改頁(yè)面=>保存:應(yīng)用不會(huì)重啟,但會(huì)重新加載,頁(yè)面會(huì)刷新
Intellij IEDA和Eclipse不同,Eclipse設(shè)置了自動(dòng)編譯之后,修改類(lèi)它會(huì)自動(dòng)編譯,而IDEA在非RUN或DEBUG情況下才會(huì)自動(dòng)編譯(前提是你已經(jīng)設(shè)置了Auto-Compile)。
修改多個(gè)文件的解決方法
如果你寫(xiě)一個(gè)邏輯代碼,需要好幾個(gè)文件,總不能你每保存一次就進(jìn)行一次熱部署。解決方法:
在application.properties添加手工觸發(fā)重啟
#通過(guò)觸發(fā)器,去控制什么時(shí)候進(jìn)行熱加載部署新的文件 spring.devtools.restart.trigger-file=trigger.txt
在src\main\resources目錄下,添加trigger.txt文件
version=1
這樣你每次改好代碼,不會(huì)每次保存就熱部署,而是改好代碼后,改trigger.txt的內(nèi)容就會(huì)進(jìn)行熱部署。
springloaded(maven插件)
在 spring-boot-maven-plugin 插件配置中添加 springloaded 依賴
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <dependencies> <!-- 該依賴在此處下載不下來(lái),可放在build標(biāo)簽外部下載完成后再粘貼進(jìn)plugin中 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.5.RELEASE</version> </dependency> </dependencies> </plugin> </plugins> </build>
配置Idea使用MVN運(yùn)行(也可以在項(xiàng)目所在路徑下打開(kāi)dos,輸入mvn spring-boot:run,然后回車(chē))
Run=> Edit Configurations=> 左上角“+”號(hào)=> 選擇MAVEN=> Name:為本命令命名; Working Directory:指定要運(yùn)行的項(xiàng)目路徑;Command line:spring-boot:run
IDEA項(xiàng)目運(yùn)行部位出現(xiàn)此配置,點(diǎn)擊綠色箭頭運(yùn)行即可
當(dāng)前springboot的端口無(wú)法關(guān)閉,必須打開(kāi)任務(wù)管理器進(jìn)行對(duì)該進(jìn)程干掉)
以下無(wú)法熱部署:
對(duì)于一些第三方的注解修改不能自動(dòng)加載,比如spring mvc的@RequestMappingapplication.properties的修改也不行l(wèi)og4j的配置文件的修改不能即時(shí)生效
springloaded本地加載啟動(dòng)
1.下載springloaded:https://github.com/spring-projects/spring-loaded
2.Run=> Edit Configurations=>SpringBoot=> Application=> Configuration=> VM options=> 輸入:-javaagent:<jar包地址> -noverify 例如:
-javaagent:C:\Users\tengj\.m2\repository\org\springframework\springloaded\1.2.6.RELEASE\springloaded-1.2.6.RELEASE.jar -noverify
到此這篇關(guān)于關(guān)于SpringBoot的熱部署方案的文章就介紹到這了,更多相關(guān)SpringBoot熱部署內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java springboot 整合 Nacos的實(shí)例代碼
這篇文章主要介紹了Java springboot 整合 Nacos的實(shí)例,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04利用Java Apache POI 生成Word文檔示例代碼
本篇文章主要介紹了利用Java Apache POI 生成Word文檔示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Java aop面向切面編程(aspectJweaver)案例詳解
這篇文章主要介紹了Java aop面向切面編程(aspectJweaver)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08Maven+SSM框架實(shí)現(xiàn)簡(jiǎn)單的增刪改查
這篇文章主要介紹了Maven+SSM框架實(shí)現(xiàn)簡(jiǎn)單的增刪改查,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03Alibaba?Fastjson之超好用的JOSN解析庫(kù)
這篇文章主要介紹了Alibaba?Fastjson之超好用的JOSN解析庫(kù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10Spring Cloud中使用Eureka的詳細(xì)過(guò)程
Eureka 是 Netflix 開(kāi)源的一個(gè)服務(wù)發(fā)現(xiàn)組件,它在微服務(wù)架構(gòu)中扮演著重要的角色,這篇文章主要介紹了Spring Cloud中如何使用Eureka,需要的朋友可以參考下2024-07-07java中棧和隊(duì)列的實(shí)現(xiàn)和API的用法(詳解)
下面小編就為大家?guī)?lái)一篇java中棧和隊(duì)列的實(shí)現(xiàn)和API的用法(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05Java編程實(shí)現(xiàn)springMVC簡(jiǎn)單登錄實(shí)例
這篇文章主要介紹了Java編程實(shí)現(xiàn)springMVC簡(jiǎn)單登錄實(shí)例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11springboot自動(dòng)裝配之@ComponentScan使用方式
@componentScan注解用于掃描指定路徑下的組件,并自動(dòng)將它們注冊(cè)為Spring?Bean,該注解支持多種過(guò)濾規(guī)則,可以自定義掃描過(guò)濾規(guī)則,Spring?Boot通過(guò)ConfigurationClassPostProcessor處理@ComponentScan注解,并在啟動(dòng)時(shí)創(chuàng)建和注冊(cè)BeanDefinition對(duì)象2025-01-01.NET Core使用SignalR實(shí)現(xiàn)實(shí)時(shí)通訊的示例代碼
SignalR是一個(gè)ASP.NETCore庫(kù),用于在客戶端和服務(wù)器之間實(shí)現(xiàn)實(shí)時(shí)通訊,本文主要介紹了.NETCore中使用SignalR實(shí)現(xiàn)實(shí)時(shí)通訊,感興趣的可以了解一下2024-11-11