IDEA開啓熱部署 SpringBoot開啓熱部署

1. 前言


在實際開發過程中,每次修改代碼就得將項目重啓,重新部署,對於一些大型應用來說,重啓時間需要花費大量的時間成本。對於一個後端開發者來說,重啓過程確實很難受啊。在 Java 開發領域,熱部署一直是一個難以解決的問題,目前的 Java 虛擬機只能實現方法體的修改熱部署,對於整個類的結構修改,仍然需要重啓虛擬機,對類重新加載才能完成更新操作。下面我=我們就看看對於簡單的類修改的熱部署怎麼實現。

2. 原理


深層原理是使用了兩個ClassLoader,一個Classloader加載那些不會改變的類(第三方Jar包),另一個ClassLoader加載會更改的類,稱爲restart ClassLoader,這樣在有代碼更改的時候,原來的restart ClassLoader 被丟棄,重新創建一個restart ClassLoader,由於需要加載的類相比較少,所以實現了較快的重啓時間。
若想探究底層實現或者自定義加載類,可以參考大佬博客

3. 方式


springboot有3中熱部署方式:

1.使用springloaded配置pom.xml文件,使用mvn spring-boot:run啓動

2.使用springloaded本地加載啓動,配置jvm參數

-javaagent:<jar包地址> -noverify

3.使用devtools工具包,操作簡單,但是每次需要重新部署
這裏主要講解一下第三種熱部署方式的使用,因爲在網上查找資源時,總會發現很多人就是springloaded和devtools都使用了,其實是多餘的操作,而且第三種操作簡單快捷。

 

4. 開始配置

4.1 在pom.xml中添加依賴
   

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--devtools熱部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
            <scope>true</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                </configuration>
            </plugin>
        </plugins>
    </build>


注:

(1) devtools可以實現頁面熱部署(即頁面修改後會立即生效,這個可以直接在application.properties文件中配置spring.thymeleaf.cache=false來實現),
實現類文件熱部署(類文件修改後不會立即生效),實現對屬性文件的熱部署。
即devtools會監聽classpath下的文件變動,並且會立即重啓應用(發生在保存時機),注意:因爲其採用的虛擬機機制,該項重啓是很快的
(2)配置了true後在修改java文件後也就支持了熱啓動,不過這種方式是屬於項目重啓(速度比較快的項目重啓),會清空session中的值,也就是如果有用戶登陸的話,項目重啓後需要重新登陸。
默認情況下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public這些文件夾下的文件修改不會使應用重啓,但是會重新加載(devtools內嵌了一個LiveReload server,當資源發生改變時,瀏覽器刷新)。

4.2 devtools的配置


在application.yml中配置一下devtools

spring:
  devtools:
    restart:
      enabled: true  #設置開啓熱部署
      additional-paths: src/main/java #重啓目錄
      exclude: WEB-INF/**
  freemarker:
    cache: false    #頁面不加載緩存,修改即時生效


4.3 IDEA中配置


當我們修改了類文件後,idea不會自動編譯,得修改idea設置。

(1)File-Settings-Compiler-Build Project automatically


(2)ctrl + shift + alt + / ,選擇Registry,勾上 Compiler autoMake allow when app running


4.4 測試


修改類–>保存:應用會重啓
修改配置文件–>保存:應用會重啓
修改頁面–>保存:應用不會重啓,但會重新加載,頁面會刷新


5. 參考資料&小結


小結
熱部署有三種方式,我被網上的各種博客搞得暈頭轉向的,本來不是個難問題,越看越複雜。最近有點自閉,對於敲代碼這件事來說,我不知道我到底喜不喜歡,還是隻是單純爲了找工作,我看着別人敲的代碼,感覺自己與別人差距還很大,我覺得自己非常菜,我不知道我要是以後固定的工作,固定的敲代碼,會不會還有進步。自閉中。。。

參考資料
其他兩種熱部署方式請參考最後一個鏈接

深入探索 Java 熱部署
SpringBoot配置devtools實現熱部署
spring boot熱部署的三種方式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章