【轉】java熱部署,即改即看

來源:互聯網
上載者:User

寫java代碼 時候打包部署是個很頭疼的問題,很是打擊寫代碼計程車氣,decvm的使用能夠很好的提高開發自測的效率,尤其是web類應用。收集了java中介軟體團隊和阿里巴巴團隊的兩片部落格,對於這個的使用做了介紹,希望做java web開發的可以使用一下呵呵。

 

----------------------------------------------------------------------------------------

 

 

關於hotswap(該補丁的網址http://ssw.jku.at/dcevm/)

Hotswap  是一個允許在運行狀態下無限制的修改載入類檔案的Java虛擬機器補丁。當前java虛擬機器的動態載入機制只允許修改類的方法體,而打了hotswap補丁以後,可以增加,刪除類屬性,方法,甚至可以改變一個類的父類。

Hotswap補丁是基於GPL v2.0開源協議的。你可以通過windows,linux,mac os下載hotswap 補丁的原始碼或者可執行檔。

安裝hotswap

警告: 該補丁目前還處於實驗階段. 當該補丁用於調試java程式使用是,是相當穩定的。但我們不提倡在生產環境中使用該補丁。

現在提供了 32, 64 Windows虛擬機器32 Mac OS (從這裡獲得), 和32 Linux 虛擬機器的補丁. 所有的修改基於 JDK7-b102版本。 安裝程式 dcevm-0.2-win.jar (5.6 MB) dcevm-0.2-mac.jar (6.0 MB) dcevm-0.2-linux.jar (5.8 MB)

該補丁不僅能打在java7上,且打到java 6上,也一樣正常工作。

在windows 啟動安裝程式,在控制台輸入:
> java -jar dcevm-0.2-win.jar

在Mac OS啟動安裝程式,終端輸入:
$ sudo java -jar dcevm-0.2-mac.jar

在Mac OS啟動安裝程式,終端輸入:
$ sudo java -jar dcevm-0.2-linux.jar

安裝程式會替換掉java下 bin/client/jvm.dll 和 bin/server/jvm.dll ,並將以後的jvm.dll備份到相應目錄下。還會將dcevm.jar 加到lib/ext/ 目錄.

圖一:hotswap補丁安裝介面。

執行上述命令後,就會出現圖一介面,選擇將要安裝該補丁的java目錄,單擊安裝就可以了。

Ps:如果你的Linux沒有圖形介面,您可以從這裡下載已經打好補丁的java。

使用hotswap調試java程式

首先用修改後的java以debug模式啟動 java程式。 使用eclipse串連到該java進程(也可以直接在eclipse中以debug方式啟動) 現在在eclipse 工程下面針對class檔案的任何修改將會直接反映到java程式中去。

hotswap在淘寶

令我們高興的是,淘寶開發人員對該技術有著強烈的興趣,目前已有如下團隊使用的該補丁:MytaobaoTeam Dev,TDDL(Rtools)Team Dev,HSFTeam Dev,交易中心等團隊。

------------------------------------------------------------------------------------------------

目前,國際站目前還是主要在幾個應用上,一個應用多的有三四十萬行代碼。幾乎所有的產品線在這個應用上都有代碼;採用分支開發,要改的代碼可能只有一點也要Check out出整個工程的代碼來。

這樣大工程,對於開發效率的影響很大,編譯一下10分鐘,啟動一下5分鐘。苦悶的等待是時間的浪費,另一方面也是打斷了開發的節奏。開發過程中,每修改了一點內容,就要編譯工程、重啟應用來驗證。每個開發員都會要頻繁重啟,浪費總量上是巨大的。

當然解決大應用的關鍵是拆根據功能拆分成小應用,這件事國際站也在積極進行中。

Hot Swap可以在Debug時讓對源檔案的修改立即生效,減少編譯和重啟的次數,節省開發時間浪費。

Java虛擬機器的預設的Hot Swap機制只允許修改類的方法體,這個限制太大。

DCE(the Dynamic Code Evolution VM)是一個允許在運行狀態下無限制的修改載入類檔案的Java虛擬機器補丁,即Hot Swap的加強。使用DCE以後,可以 增加、刪除 類的屬性、方法 改變一個類的父類

這樣的加強,完全滿足平時開發時需要。DCE是基於GPL v2.0開源協議的。你可以通過Windows,Linux,Mac OS下載DCE的原始碼或者可執行檔。

下面記錄了DCE使用中遇到的和整理了網上提到的對DCE的問題及其解決。 DCE注意

Linux下,DCE目前只支援32位JVM,不支援64位JVM。

與JDK 1.6 update 26有相容問題,使用JDK 1.6 update 25

# 參見官網 http://ssw.jku.at/dcevm/binaries/ 的說明。

  問題及其解決方案

下面是在國際站開發環境整合DCE的過程中,收集的問題以及解決方案的記錄總結和匯總。

1. 和asm、cglib相關的jar包衝突。

異常:

Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V    at net.sf.cglib.core.DebuggingClassWriter.<init>(DebuggingClassWriter.java:47)    at net.sf.cglib.core.DefaultGeneratorStrategy.getClassWriter(DefaultGeneratorStrategy.java:30)    at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:24)    at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)    at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145)    at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:117)    at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108)    at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104)    at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)    at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:117)    at org.hibernate.proxy.pojo.cglib.CGLIBProxyFactory.postInstantiate(CGLIBProxyFactory.java:43)

參見DCE的JIRA http://kenai.com/jira/browse/DCEVM-4

原因:dcevm.jar檔案中包含了一份ASM類,版本較老,並優先載入。(阿幹發現這個問題,並給出重新命名包名的解決方案)

解決方案1:

重新命名dcevm.jar檔案中asm的包名,從 org.objectweb.asm 重新命名成 dce.org.objectweb.asm。

# 在Jar檔案上重新命名包名 使用工具: JarJar(http://code.google.com/p/jarjar/)。

解決方案2:

asm、cglib換成了新的版本:asm-3.3.1.jar、cglib-nodep-2.2.jar。

asm、cglib各版本匹配注意點:

    asm 1.5.3.jar 匹配 cglib-2.1.3.jar

    asm-2.X.jar asm-3.x.jar 匹配  cglib-nodep-2.1_3.jar

2. 動態添加的static屬性,例如 private static String attrib1 = "x",調用時會顯示attrib1是null。

3. 在一個正在執行的迴圈中,改變可能不能生效。例如:

public static void main(String[] args) {       for (int i = 0; i < 10000; i++) {           test(); //sleep 1s and print something       }}

修改為:

public static void main(String[] args) {        for (int i = 0; i < 10000; i++){            test();            System.out.println("xxx");        }}

xxx是不能輸出的。

但test方法體內部的修改是可以生效的。例如:

public static void main(String[] args) {        System.out.println("xxx");        for (int i = 0; i < 10000; i++) {            test();        }}

5. Crash when running maven test goal with jmockit

參見DCE的JIRA http://kenai.com/jira/browse/DCEVM-3

6. DCEVM啟動報錯

Must use the serial GC in the Dynamic Code Evolution VMCould not create the Java virtual machine.

把JAVA啟動參數中並發GC的選項刪除,如:

-XX:+UseConcMarkSweepGC-XX:+CMSIncrementalMode-XX:+CMSIncrementalPacing-XX:CMSIncrementalDutyCycleMin=0-XX:CMSIncrementalDutyCycle=10

開發模式下,修改這些選項不會有功能上的影響。

  一些參考資料 DCE官方網址 http://ssw.jku.at/dcevm/ hotswap 使用者手冊 – 淘寶JAVA中介軟體團隊部落格http://rdc.taobao.com/team/jm/archives/641 hostswap dcevm – 使用介紹http://www.cnblogs.com/redcreen/archive/2011/06/03/2071169.html Dynamic Code Evolution for Java dcevm 原理http://www.cnblogs.com/redcreen/archive/2011/06/14/2080718.html Java HotSpot dcevm 在debug模式下的熱部署http://sjsky.iteye.com/blog/907606 深入 Java 調試體系 http://www.ibm.com/developerworks/cn/java/j-lo-jpda1/ Java Platform Debugger Architecturehttp://java.sun.com/javase/technologies/core/toolsapis/jpda/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.