什么是spring-loaded?
spring-loaded是一個對于jvm代理運行時期改變類文件的重載(重新加載),它轉換類loadtime讓他們服從后重新加載。不像“熱代碼替換”只允許一次簡單的改變JVM運行(例如更改方法體)spring-loaded允許您添加/修改/刪除/字段/方法構造函數。注釋類型/方法/字段/構造函數也可以修改和可以添加/刪除/修改值的枚舉類型。
有什么好處?
開發測試階段:能夠在啟動后動態更改代碼調試,無需重啟減少切換debug時間(ps:對于eclipse而言,在debug時期只能做到動態更新方法體不能增加)
對于線上測試發布階段: 能夠在出現問題后直接替換class文件而不重啟應用(ps:對于外部提供的服務jar形式同樣能做到)
怎么使用?
項目地址
https://github.com/spring-projects/spring-loaded
第一步:下載文件
http://repo.spring.io/release/org/springframework/springloaded/1.2.5.RELEASE/springloaded-1.2.5.RELEASE.jar第二步:配置jvm啟動參數
eclipse
eclipse:run as --> run configurations --> arguments -->> VM arguments
-javaagent:E:\repository\org\springframework\spring-load\springloaded-1.2.5.RELEASE.jar
-noverify -Dspringloaded=verbose
詳細描述:
-javaagent: 配置java代理使用下載后的jar包路徑
-noverify: 禁用字節碼驗證
-Dspringloaded=verbose 顯示springloaded時的詳細信息

java命令啟動
java -javaagent:E:\repository\org\springframework\spring-load\springloaded-1.2.5.RELEASE.jar -noverify Test 類似
java jar包動態替換
1.打成runnable Jar
2.命令啟動:
java -javaagent:E:\repository\org\springframework\spring-load\springloaded-1.2.5.RELEASE.jar -noverify -Dspringloaded=watchJars=main.jar main.jar
/** * 類Test.java的實現描述:TODO 類實現描述 * @author Administrator 2016年7月4日 下午4:55:59 */ public class Test { public static void main(String[] args) throws InterruptedException { while(true) { try { println(); Thread.sleep(1000); } catch (Throwable e) { e.printStackTrace(); } } } public static void println() { System.out.println("112222221222222"); } }
改變為
/** * 類Test.java的實現描述:TODO 類實現描述 * @author Administrator 2016年7月4日 下午4:55:59 */ public class Test { public static void main(String[] args) throws InterruptedException { while(true) { try { println(); Thread.sleep(1000); } catch (Throwable e) { e.printStackTrace(); } } } public static void println() { System.out.println("test replace jar"); } }
3.重新打包替換
PS:實測在window下無用 手上無linux機器待測試
1