<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    I want to fly higher
    programming Explorer
    posts - 114,comments - 263,trackbacks - 0
    1.背景
        對于Java游戲服務(wù)器來說,通常通過腳本運行jar執(zhí)行。在開發(fā)測試環(huán)境下,需要經(jīng)常打包、重新部署的需求,而往往重啟服務(wù)器通常需要花費一定時間。而有了Spring-Loaded這個利器,直接替換運行的補丁jar,即可達(dá)到熱更新功能.

    2.說明
       目前官網(wǎng)上的release版本:springloaded-1.2.3.RELEASE.jar,并不支持reload jar這個功能,這個功能在1.2.4才開放。不過你可以git clone下源代碼,用gradle build最新的jar:springloaded-1.2.4.BUILD-SNAPSHOT.jar。不過這個版本可能些許問題,即對我們的"windoze"支持不太友好,這個問題已經(jīng)和其作者聯(lián)系過了,最新github上的代碼應(yīng)該修復(fù)了。我是本地自己修改了一下(具體怎么修改的,可以參見我的博客中和作者的幾封郵件),然后build的。當(dāng)然如果你是mac或者是linux運行,則會完美運行。

    3.參數(shù)
      -Dspringloaded=watchJars=foo.jar:bar.jar
       即watchJars選項,監(jiān)聽的多個jar之前用:分離

    4.例子
        有兩個jar,一個spring-load-main.jar,一個spring-load-extra.jar,前者依賴后者,后者業(yè)務(wù)可能會經(jīng)常變化,有熱更新的需求。這里模擬一下線上環(huán)境,用腳本啟動進程(windows),然后修改邏輯,重新打包,替換jar,看是否可以達(dá)到reload的目的
      1.啟動腳本:spring-loaded-example_launch.bat

    @echo off

    cd /%~dp0

    java -noverify -javaagent:springloaded-1.2.4.BUILD-SNAPSHOT.jar -cp spring-load-main.jar;spring-load-extra.jar -Dspringloaded=verbose;explain;watchJars=spring-load-extra.jar com.mavsplus.example.springloaded.SpringLoadedExample2
        說明:springloaded-1.2.4.BUILD-SNAPSHOT.jar/spring-load-main.jar/spring-load-extra.jar 這三個jar是在同一個目錄."-javaagent"這個必須,指定agent為spring-loaded.通過-Dspringloaded=watchJars指定了監(jiān)聽的jar為spring-load-extra.jar
    ,main類為SpringLoadedExample2

      2.spring-loaded-main.jar只有一個類SpringLoadedExample2,spring-loadex-extra.jar也只有一個類Reload

    package com.mavsplus.example.springloaded;

    import java.util.concurrent.TimeUnit;

    /**
     * <a href="https://github.com/spring-projects/spring-loaded"></a>
     * 
     * <pre>
     *     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.
     * </pre>
     * 
     * @author landon
     * @since 1.8.0_25
     
    */
    public class SpringLoadedExample2 {

        public static void main(String[] args) throws Exception {
            Reload reload = new Reload();

            while (true) {
                reload.load();

                TimeUnit.SECONDS.sleep(3);
            }
        }
    }  

    package com.mavsplus.example.springloaded;

    /**
     * 可reload的實現(xiàn)類
     * 
     * @author landon
     * @since 1.8.0_25
     
    */
    public class Reload {

        public void load() {
            System.out.println("load");
        }
    }

      3.運行啟動腳本:spring-loaded-example_launch.bat

    E:\github\mavsplus-all\mavsplus-examples\src\main\resources>spring-loaded-exampl
    e_launch.bat
    SL: [verbose mode on] Full configuration is:verbose;explain;watchJars=spring-loa
    d-extra.jar
    SL: [explain mode on] Reporting on the decision making process within SpringLoad
    ed
    七月 012015 8:25:16 下午 org.springsource.loaded.agent.SpringLoadedPreProcesso
    r logPreProcess



    r logPreProcess
    信息: SpringLoaded preprocessing: classname=java/util/concurrent/TimeUnit$7 clas
    sloader=null typeRegistry=null
    load
    load
    load
    load

       4.修改Reload.java,輸出reload,然后重新打一個包并覆蓋掉spring-load-extra.jar,這時候看到命令行輸出:

    load
    load
    七月 012015 8:28:51 下午 org.springsource.loaded.agent.Watcher run
    信息: Observed last modification time change for e:\github\mavsplus-all\mavsplus
    -examples\src\main\resources\spring-load-extra.jar (lastScanTime=1435753730694)
    七月 012015 8:28:51 下午 org.springsource.loaded.agent.Watcher determineChange
    sSince
    信息: Firing file changed event e:\github\mavsplus-all\mavsplus-examples\src\mai
    n\resources\spring-load-extra.jar
    七月 012015 8:28:51 下午 org.springsource.loaded.agent.SpringLoadedPreProcesso
    r logPreProcess
    信息: SpringLoaded preprocessing: classname=java/util/HashMap$KeyIterator classl
    oader=null typeRegistry=null



    信息: SpringLoaded preprocessing: classname=java/io/ObjectStreamClass$Caches cla
    ssloader=null typeRegistry=null
    reload
    reload
    reload
    reload
       看上面紅色部分,我們可以清楚的看到spring-loaded檢測到了jar的時間戳的改變,并將其重新加載了,從輸出我們可以看到

    5.總結(jié):
       通過該例子我們可以清楚的看到,用spring-loaded簡直太幸福了。。直接替換jar包。。直接更新。。完美
       相對比JRebel還需要指定一個monitor jar class jar。。簡單多了。。具體對比可以參考我的上一篇隨筆: http://m.tkk7.com/landon/archive/2015/06/26/425909.html

          后續(xù):會深入源代碼以及更深層次的例子而不僅僅是直接替換方法body形式的熱加載。。進行深入剖析

    posted on 2015-07-01 20:40 landon 閱讀(7740) 評論(2)  編輯  收藏 所屬分類: JVMHotSwap

    FeedBack:
    # re: Spring-Loaded 使用Ⅱ-Reload Jar
    2015-09-15 15:23 | 趙輝
    貌似1.2.4也沒開放  回復(fù)  更多評論
      
    # re: Spring-Loaded 使用Ⅱ-Reload Jar
    2015-10-05 23:01 | landon
    @趙輝
    我沒有用1.2.4,直接自己build的代碼并修改了對于windows的一個小的bug。
    你可以查看一下1.2.4相關(guān)代碼。TypeRegistry#couldBeReloadable,是否fixed了對于windows的支持。 int lastSlashPos = slashedName.lastIndexOf(File.separator);  回復(fù)  更多評論
      
    主站蜘蛛池模板: 亚洲videos| 久久久久免费精品国产小说| 亚洲av一综合av一区| 国产在线ts人妖免费视频| 在线观看成人免费视频不卡| 中文字幕日本人妻久久久免费| 亚洲精品色在线网站| 亚洲乱码一区二区三区国产精品| 亚洲国产成人久久精品影视| 亚洲婷婷国产精品电影人久久| 国产美女做a免费视频软件| 男男AV纯肉无码免费播放无码 | 麻豆亚洲AV永久无码精品久久| 浮力影院亚洲国产第一页| 可以免费观看一级毛片黄a| 免费看少妇作爱视频| 好男人www免费高清视频在线| 中文字幕在线免费| 久久精品免费视频观看| 两个人的视频www免费| 久久一区二区三区免费| 一级毛片在线免费播放| 一个人看的www免费高清| 特黄特色大片免费| 亚洲情a成黄在线观看动漫尤物| 亚洲美女又黄又爽在线观看| 国产亚洲精品无码专区| 国产亚洲精品国看不卡| 亚洲区小说区激情区图片区| 亚洲中文字幕久久精品无码喷水 | 亚洲一级免费毛片| xxx毛茸茸的亚洲| 亚洲综合色7777情网站777| 亚洲伊人久久大香线焦| 亚洲乱码一二三四五六区| 亚洲AV色吊丝无码| 亚洲熟妇无码八V在线播放| 亚洲欧美日韩中文字幕一区二区三区| 中文字幕精品三区无码亚洲| 亚洲性色精品一区二区在线| 亚洲AV性色在线观看|