Spring-loaded實現熱部署-開發環境

hjwzyy發表於2017-08-23

Oracle提供的JDK其實已經自帶一定程度的熱載入功能,但是如果你修改了類名,方法名,或者新增了新類,新方法的話。Tomcat都需要重新啟動來使得剛才的更改生效。而JRebel和spring-loaded都能有效地解決這個問題。其中springloaded是開源軟體,可以免費使用。其主頁:https://github.com/spring-projects/spring-loaded

獲取jar包

首先我們需要得到spring-loaded的jar包,上面的github連結中可以下載到。這裡我用的是最新的springloaded-1.2.7.RELEASE.jar

存放位置:D:\springloaded-1.2.7.RELEASE.jar

IDE中部署

開啟專案,在啟動之前按以下進行配置

idea中

在啟動Tomcat之前配置VM option。填寫以下引數:

-javaagent:D:/springloaded-1.2.7.RELEASE.jar -noverify

其中引數中Springloaded的路徑按實際填寫

Markdown

配置完成後可以啟動專案了


eclipse中

右擊專案->Run as->Run configurations… 在tomcat啟動項新增VM引數

-javaagent:D:/springloaded-1.2.7.RELEASE.jar -noverify

其中引數中Springloaded的路徑按實際填寫

Markdown

配置完成後可以啟動專案了

測試

為了解Springloaded 適用於哪些更改,下面來作幾個測試


我在上述啟動的SSM專案中,在一個控制器裡新增了以下方法

/**
 * 測試SpringLoaded
 */
@RequestMapping("/hello")
@ResponseBody 
public  String test(){
    return "Hello Spring Loaded!";
}

儲存後通過瀏覽器訪問失敗,找不到/hello 這個路徑。通過重啟Tomcat後可以正常訪問test方法


繼續新增test2()方法,不使用註解,為了在瀏覽器中方便測試,通過test()方法來訪問test2()方法。(經過上面重啟Tomcat後test方法可以訪問)

/**
 * 測試SpringLoaded
 */
@RequestMapping("/hello")
@ResponseBody
public  String test(){
   return this.test2();
}

public  String test2(){
   return "Spring Loaded By Test2";
}

瀏覽器輸出

​ “Spring Loaded By Test2”

說明我們新增的第二個方法test2()沒有經過重啟伺服器就可以訪問了,熱部署生效


我們繼續 新建一個類,並在test()方法中去呼叫

/**新建類
 * Created by JiangWei.Huang
 * 2017/8/22 0022.
 */
@RestController
public class TestCtrl {
    @GetMapping("/hello3")
    public String test3(){
        return "TestCtrl-test3";
    }
}
/**修改test方法呼叫新建的類TestCtr中的test3方法
 * 測試SpringLoaded
 */
@RequestMapping("/hello")
@ResponseBody
public  String test(){
   TestCtrl testCtrl = new TestCtrl();
   return testCtrl.test3();
}

瀏覽器輸出

​ “TestCtrl-test3”

說明我們新建的類,在不用重啟的情況下也能夠被呼叫到了,熱部署生效

但值得注意的是,我們新建的類中,在類上與方法上都寫了Spring註解,但這裡是也不生效的。@RestController這個註解沒有生效,/hello3這個路徑也是訪問不了的。需要重啟伺服器才生效

另外在Idea中修改後自動儲存但不會自動重新編譯,如果在Idea中修改後熱部署沒有生效,按ctrl+shift+f9重新編譯。也可以設定Idea自動編譯,設定如下圖。

Markdown

總結

經過上面的測試我們可以得出一些結論。像官方所說,可以實現以下的熱更新

Spring Loaded allows you to add/modify/delete methods/fields/constructors. The annotations on types/methods/fields/constructors can also be modified and it is possible to add/remove/change values in enum types.

Spring載入允許您新增/修改/刪除/欄位/方法建構函式。註釋型別/方法/欄位/建構函式,並且還可以在列舉型別中新增/刪除/更改值。

但是對於第三方像是Spring註解這些的修改,spring-loaded就無能為力了,必須求助於更加強大的,收費的JRebel了

相關文章