1. 程式人生 > >Spring Boot:(十)開發常用的熱部署方式彙總

Spring Boot:(十)開發常用的熱部署方式彙總

前言

平時開發Sprig Boot的時候,經常改動個小小的地方就要重新啟動專案,這無疑是一種很差的體驗。在此,博主收集了3種熱部署的方案供大家選擇。本文為轉載內容:Spring Boot乾貨系列:(十)開發常用的熱部署方式彙總

正文

目前博主用過的有三種:

  • Spring Loaded
  • spring-boot-devtools
  • JRebel外掛

博主開發環境

  • 系統:win10
  • 開發工具:IDE:IntelliJ IDEA 2017.1
  • spring-boot版本:1.5.3RELEASE
  • JDK:1.8

Spring Loaded 實現熱部署

Spring Loaded是一個用於在JVM執行時重新載入類檔案更改的JVM代理,Spring Loaded允許你動態的新增/修改/刪除某個方法/欄位/構造方法,同樣可以修改作用在類/方法/欄位/構造方法上的註解.也可以新增/刪除/改變列舉中的值。

Spring Loaded有兩種方式實現,分別是Maven引入依賴方式或者新增啟動引數方式

Maven依賴方式

1
2
3
4
5
6
7
8
9
10
11
<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>

啟動:mvn spring-boot:run
如果你也是IDEA的話,直接介面上雙擊執行即可,如下圖

Paste_Image.png

注意:maven依賴的方式只適合spring-boot:run的啟動方式,右鍵那種方式不行。

出現如下配置表實配置成功:

1
[INFO] Attaching agents: [C:\Users\tengj\.m2\repository\org\springframework\springloaded\1.2.6.RELEASE\springloaded-1.2.6.RELEASE.jar]

新增啟動引數方式

這種方式是右鍵執行啟動類
首先先下載對應的springloaded-1.2.6.RELEASE.jar,可以去上面提到的官網獲取
博主這裡直接引用maven依賴已經下載好的路徑哈

然後開啟下圖所示的Edit Configurations配置,在VM options中輸入:

1
-javaagent:C:\Users\tengj\.m2\repository\org\springframework\springloaded\1.2.6.RELEASE\springloaded-1.2.6.RELEASE.jar -noverify

Paste_Image.png

然後直接右鍵執行啟動類即可啟動專案。

上面2種方式小夥伴隨便選擇一種即可,當系統通過 mvn spring-boot:run啟動或者 右鍵application debug啟動Java檔案時,系統會監視classes檔案,當有classes檔案被改動時,系統會重新載入類檔案,不用重啟啟動服務。

注:IDEA下需要重新編譯檔案 Ctrl+Shift+F9或者編譯專案 Ctrl+F9

如何測試熱部署是否可用呢,你可以先寫個簡單的Controller方法,返回個字串,然後啟動專案,接著修改下這個方法返回的字串,Ctrl+Shift+F9編譯下當前類,然後再重新整理下頁面看看是否內容改變了。

在 Spring Boot,模板引擎的頁面預設是開啟快取,如果修改頁面內容,重新整理頁面是無法獲取修改後的頁面內容,所以,如果我們不需要模板引擎的快取,可以進行關閉。

1
2
3
spring.freemarker.cache=false
spring.thymeleaf.cache=false
spring.velocity.cache=false

經過博主簡單的測試,發現大多數情況可以使用熱部署,有效的解決了文章頭部中提到的那個痛點,不過還是有一些情況下需要重新啟動,不可用的情況如下:
1:對於一些第三方框架的註解的修改,不能自動載入,比如:spring mvc的@RequestMapping
2:application.properties的修改也不行
3:log4j的配置檔案的修改不能即時生效

spring-boot-devtools 實現熱部署

spring-boot-devtools為應用提供一些開發時特性,包括預設值設定,自動重啟,livereload等。

想要使用devtools熱部署功能,maven新增依賴如下:

1
2
3
4
5
6
7
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

將依賴關係標記為可選<optional>true</optional>是一種最佳做法,可以防止使用專案將devtools傳遞性地應用於其他模組。

預設屬性

在Spring Boot整合Thymeleaf時,spring.thymeleaf.cache屬性設定為false可以禁用模板引擎編譯的快取結果。

現在,devtools會自動幫你做到這些,禁用所有模板的快取,包括Thymeleaf, Freemarker, Groovy Templates, Velocity, Mustache等。

自動重啟

自動重啟的原理在於spring boot使用兩個classloader:不改變的類(如第三方jar)由base類載入器載入,正在開發的類由restart類載入器載入。應用重啟時,restart類載入器被扔掉重建,而base類載入器不變,這種方法意味著應用程式重新啟動通常比“冷啟動”快得多,因為base類載入器已經可用並已填充。

所以,當我們開啟devtools後,classpath中的檔案變化會導致應用自動重啟。
當然不同的IDE效果不一樣,Eclipse中儲存檔案即可引起classpath更新(注:需要開啟自動編譯),從而觸發重啟。而IDEA則需要自己手動CTRL+F9重新編譯一下(感覺IDEA這種更好,不然每修改一個地方就重啟,好蛋疼)

排除靜態資原始檔

靜態資原始檔在改變之後有時候沒必要觸發應用程式重啟,例如thymeleaf模板檔案就可以實時編輯,預設情況下,更改/META-INF/maven, /META-INF/resources ,/resources ,/static ,/public 或/templates下的資源不會觸發重啟,而是觸發live reload(devtools內嵌了一個LiveReload server,當資源發生改變時,瀏覽器重新整理,下面會介紹)。

可以使用spring.devtools.restart.exclude屬性配置,例如

1
spring.devtools.restart.exclude=static/**,public/**

如果想保留預設配置,同時增加新的配置,則可使用

1
spring.devtools.restart.additional-exclude屬性

觀察額外的路徑

如果你想觀察不在classpath中的路徑的檔案變化並觸發重啟,則可以配置 spring.devtools.restart.additional-paths 屬性。

不在classpath內的path可以配置spring.devtools.restart.additionalpaths屬性來增加到監視中,同時配置spring.devtools.restart.exclude可以選擇這些path的變化是導致restart還是live reload。

關閉自動重啟

設定 spring.devtools.restart.enabled 屬性為false,可以關閉該特性。可以在application.properties中設定,也可以通過設定環境變數的方式。

1
2
3
4
public static void main(String[] args) {
    System.setProperty("spring.devtools.restart.enabled", "false");
    SpringApplication.run(MyApp.class, args);
}

使用一個觸發檔案

若不想每次修改都觸發自動重啟,可以設定spring.devtools.restart.trigger-file指向某個檔案,只有更改這個檔案時才觸發自動重啟。

自定義自動重啟類載入器

預設時,IDE中開啟的專案都會由restart載入器載入,jar檔案由Base載入器載入,但是若你使用multi-module的專案,並且不是所有模組都被匯入到IDE中,此時會導致載入器不一致。這時你可以建立META-INF/spring-devtools.properties檔案,並增加restart.exclude.XXX,restart.include.XXX來配置哪些jar被restart載入,哪些被base載入。如:

1
2
restart.include.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar

LiveReload

DevTools內建了一個LiveReload服務,可以在資源變化時用來觸發瀏覽器重新整理。當然這個需要你瀏覽器安裝了LiveReload外掛,並且啟動這個外掛才行。很有意思,這裡介紹下如何弄。

先去谷歌商店安裝LiveReload外掛,自己準備梯子。

Paste_Image.png

安裝好在要自動重新整理的頁面點選下圖中圖示,啟動應用後更新頁面內容或者css等都會觸發頁面自動重新整理了。如下圖,圈中的就是,點一下會變黑就是啟動了。

Paste_Image.png

最後展示效果,修改完html頁面後,Ctrl+Shift+F9,沒有重啟,頁面也會自動重新整理了,太有趣了。

livereload.gif

如果您不想在應用程式執行時啟動LiveReload伺服器,則可以將spring.devtools.livereload.enabled屬性設定為false。

一次只能執行一個LiveReload伺服器。開始應用程式之前,請確保沒有其他LiveReload伺服器正在執行。
如果你的IDE啟動多個應用程式,則只有第一個應用程式將支援LiveReload。

JRebel外掛方式

在IDEA中開啟外掛管理介面,按照下面的提示先安裝上

Paste_Image.png

安裝完外掛後,需要去獲取正版的啟用碼,這個可以直接去官網https://my.jrebel.com獲取(需自備梯子)

1:通過fackbook登入,沒有就去註冊一個

image

2:填寫一些資料後(資料必須填寫完整,否則JRebel激活不了),複製啟用碼即可

image

3:重啟IDEA後,在IDEA的Settings中找到JRebel輸入複製的啟用碼即可

Paste_Image.png

出現綠色,即表示啟用成功了。
Paste_Image.png
4: 接著就如下所示,勾中JRebel方式後啟動即可,即可享受JRebel帶來的超爽體驗

Paste_Image.png

相關推薦

Spring Boot開發常用部署方式彙總

前言平時開發Sprig Boot的時候,經常改動個小小的地方就要重新啟動專案,這無疑是一種很差的體驗。在此,博主收集了3種熱部署的方案供大家選擇。本文為轉載內容:Spring Boot乾貨系列:(十)開發常用的熱部署方式彙總正文目前博主用過的有三種:Spring Loaded

學習Spring Boot使用hibernate validation完成資料後端校驗

前言 後臺資料的校驗也是開發中比較注重的一點,用來校驗資料的正確性,以免一些非法的資料破壞系統,或者進入資料庫,造成資料汙染,由於資料檢驗可能應用到很多層面,所以系統對資料校驗要求比較嚴格且追求可變性及效率。 瞭解 瞭解一點概念性的東東。 * JSR 3

Spring BootSpring Boot使用單元測試

前言這次來介紹下Spring Boot中對單元測試的整合使用,本篇會通過以下4點來介紹,基本滿足日常需求Service層單元測試Controller層單元測試新斷言assertThat使用單元測試的回滾正文Spring Boot中引入單元測試很簡單,依賴如下:1 2 3 4

Spring Boot學習Spring Boot 與快取

快取,我們應該已經很熟悉了。那麼今天就來學習一下Spring Boot中怎麼使用快取。 1、說起快取,先來了解下JSR107 首先什麼是JSR?         JSR是Java Specification Requests 的縮寫 ,Java規範請求,故名思議提交

Spring Boot 入門整合Redis哨兵模式,實現Mybatis二級快取

本片文章續《Spring Boot 入門(九):整合Quartz定時任務》。本文主要基於redis實現了mybatis二級快取。較redis快取,mybaits自帶快取存在缺點(自行谷歌)。本文是基於docker安裝redis主從模式。 1.redis安裝 (1)首先安裝redis叢集模式,建立redis目錄

Spring Boot預設日誌logback配置解析

前言今天來介紹下Spring Boot如何配置日誌logback,我們帶著下面幾個問題來學習。如何引入日誌?日誌輸出格式以及輸出方式如何配置?程式碼中如何使用?正文Spring Boot在所有內部日誌中使用Commons Logging,但是預設配置也提供了對常用日誌的支援,

Spring Boot啟動原理解析

前言前面幾章我們見識了SpringBoot為我們做的自動配置,確實方便快捷,但是對於新手來說,如果不大懂SpringBoot內部啟動原理,以後難免會吃虧。所以這次博主就跟你們一起一步步揭開SpringBoot的神祕面紗,讓它不在神祕。正文我們開發任何一個Spring Boot

spring-boot-route多資料來源切換

前面我們已經介紹了三種方式來操作資料庫,在實際開發中,往往會出現一個服務連線多個數據庫的需求,這時候就需要在專案中進行靈活切換資料來源來完成多個數據庫操作。這一章中,我們使用jdbcTemplate來學習多資料來源的配置。 ## 一 準備工作 ### 1.1 建庫、建表 我們新建兩個庫`db1`和`db

Spring Boot乾貨系列開發Web應用之JSP篇

前言     上一篇介紹了Spring Boot中使用Thymeleaf模板引擎,今天來介紹一下如何使用SpringBoot官方不推薦的jsp,雖然難度有點大,但是玩起來還是蠻有意思的。 正文      先來看看整體的框架結構,跟前面介紹

Spring Boot乾貨系列開發Web應用之Thymeleaf篇

 前言       Web開發是我們平時開發中至關重要的,這裡就來介紹一下Spring Boot對Web開發的支援。 正文      Spring Boot提供了spring-boot-starter-web為Web開

學習 Spring BootSpring Boot Junit 單元測試

前言 JUnit 是一個迴歸測試框架,被開發者用於實施對應用程式的單元測試,加快程式編制速度,同時提高編碼的質量。 JUnit 測試框架具有以下重要特性: 測試工具 測試套件 測試執行器 測試分類 瞭解 Junit 基礎方法 加入依賴 在 p

Spring Boot 入門整合 WebSocket, 實時顯示系統日誌

以前面的部落格為基礎,最近一篇為Spring Boot 入門(十):整合Redis哨兵模式,實現Mybatis二級快取。本篇部落格主要介紹了Spring Boot整合 Web Socket進行日誌的推送,並實時顯示在頁面上。 1.匯入jar包 第一個jar包是websocket的,第二個jar包是關於環形佇列

Spring Boot 入門報表匯出,對比poi、jxl和esayExcel的效率

本片部落格是緊接著Spring Boot 入門(十一):整合 WebSocket, 實時顯示系統日誌寫的 關於poi、jxl和esayExcel的介紹自行百度。 jxl最多支援03版excel,所以單個sheet頁面最多隻能匯出65536條資料。 我直接將excel匯入到瀏覽器並開啟,以下統計匯出時長指將資

Spring Boot教程整合elk1

分享圖片 operation you 運行 hot href iba for 分享 elk 簡介 Elasticsearch是個開源分布式搜索引擎,它的特點有:分布式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。

企業級 Spring Boot 教程 上傳文件

throw www. form mapping frame 自己的 rop map 分布 這篇文章主要介紹,如何在springboot工程作為服務器,去接收通過http 上傳的multi-file的文件。 構建工程 為例創建一個springmvc工程你需要spring-bo

Android 開發初識ExpandableListView(可擴充套件的下拉列表元件)

隨便扯點兒 前幾天做iOS仿QQ,其中好友列表頁面就有下拉列表的功能,iOS做法應該比安卓稍微複雜一點,其中佈局以及一些實現方法(協議方法)都類似,不一樣的應該是動畫切換效果,安卓提供現成的元件,用原生的就可以實現。 iOS示例 http://blog.

Spring Boot學習使用@SpringBootTest註解進行單元測試

一、簡介 專案中經常會遇到需要單元測試的情況,那麼SpringBoot如何實現這種需求,使用@SpringBootTest註解可以執行環境,測試後臺程式碼。 二、環境準備 eclipse + maven + Spring Boot 三、程式碼示例 pom.xml

Spring boot入門快速搭建Spring boot專案

(一)Spring boot介紹   本部分摘自:https://www.zhihu.com/question/64671972/answer/223383505   Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定

Spring boot入門SpringBoot整合結合AdminLTE(Freemarker),利用generate自動生成程式碼,利用DataTable和PageHelper進行分頁顯示

  關於SpringBoot和PageHelper,前篇部落格已經介紹過Spring boot入門(二):Spring boot整合MySql,Mybatis和PageHelper外掛,前篇部落格大致講述了SpringBoot如何整合Mybatis和Pagehelper,但是沒有做出實際的範例,本篇部落格是連

Spring Boot 入門 自動化配置實現

自動化配置實現 我們在上章編寫入門案例的時候,我們使用的是Spring Mvc 作為我們的表現層框架,但是我們都知道我們要使用Spring Mvc 我們就需要在web.xml檔案中配置Spring Mvc 的前端控制器DispatcherServlet。但是我們