專利名稱:一種Java應(yīng)用程序的更新方法及裝置的制作方法
技術(shù)領(lǐng)域:
本申請涉及計(jì)算機(jī)領(lǐng)域,特別涉及一種應(yīng)用程序的更新方法及裝置。
背景技術(shù):
在Java軟件開發(fā)過程中,開發(fā)人員每次修改代碼后需要重新編譯,并封裝為應(yīng)用程序,然后重新啟動應(yīng)用程序,才能看到修改后的最終執(zhí)行效果;某些應(yīng)用程序重新編譯后,重新啟動需要較長時(shí)間,例如,無法分割成模塊開發(fā)的應(yīng)用程序(如,WEB應(yīng)用的TOB層開發(fā)),對于此種應(yīng)用程序,每次即使修改很少量的代碼,都需要重新編譯封裝整個應(yīng)用程序,并且關(guān)閉再重新啟動WEB應(yīng)用服務(wù)器(如,Jboss)。在企業(yè)級的開發(fā)中,一般情況下,修改普通的應(yīng)用程序,從修改代碼到關(guān)閉并重新啟動WEB服務(wù)器,這一過程需要5分鐘左右的時(shí)間,對于較大的應(yīng)用程序,這一過程可能需要10多分鐘的時(shí)間;而在程序編寫過程中,開發(fā)人員需要定期查看當(dāng)前代碼的運(yùn)行結(jié)果并作相應(yīng)修改,以保證代碼按照了開發(fā)人員的意愿呈現(xiàn)相應(yīng)效果,因此需要不斷地關(guān)閉并重新啟動WEB服務(wù)器,這樣,便令無謂花在代碼編譯、重啟應(yīng)用程序上的時(shí)間大大提升,尤其是當(dāng)修復(fù)代碼錯誤時(shí),這種消耗更為明顯,從而嚴(yán)重降低了代碼研發(fā)的效率。另外,對于大型服務(wù)性應(yīng)用程序來說,在升級過程中,往往需要重新啟動應(yīng)用程序,重新編譯部署,并重新發(fā)布應(yīng)用程序,在重啟服務(wù)過程中,往往需要中斷對外的服務(wù),從而影響系統(tǒng)的服務(wù)質(zhì)量。針對上述問題,現(xiàn)有技術(shù)下提供了兩種解決方案第一種解決方案為直接使用WEB服務(wù)器(如,tomcat,Jboss)的熱部署功能。即 WEB服務(wù)器監(jiān)控文件改變,如果某個文件被修改,WEB服務(wù)器便重新加載該文件所屬模塊; 從而實(shí)現(xiàn)熱部署。但是采用此種解決方案,存在以下缺點(diǎn)A.WEB服務(wù)器通過監(jiān)控文件改變,重新加載整個模塊,僅能針對sevlet ( 一種服務(wù)器端的Java應(yīng)用程序)進(jìn)行熱加載;對于使用了框架的應(yīng)用程序,無法加載框架內(nèi)的內(nèi)容, 如果通過servlet熱加載來實(shí)現(xiàn)框架代碼的更新,需要再次初始化框架,速度非常緩慢.B、每次修改文件后,WEB服務(wù)器會自動進(jìn)行熱部署,這會使內(nèi)存需求增加,同時(shí),由于要重新初始化相應(yīng)模塊,所以會占用大量CPU資源;多次熱部署后,系統(tǒng)資源會被大量占用,從而不得不停止熱部署,重新編譯應(yīng)用程序和重新啟動服務(wù)。第二種解決方案為采用hotswap的方法,通過Java虛擬機(jī)(Jvm)提供的接口 (Jpda或者Jvmti),來改變Java虛擬機(jī)的狀態(tài),將修改過的類文件(.class文件)替換Jvm 中原有的.class文件。采用上述解決方案可以實(shí)現(xiàn)對運(yùn)行狀態(tài)中能夠到達(dá)的區(qū)域進(jìn)行修改,采用的調(diào)式工具可以是debug,具有一定的熱部署能力。然而,采用此種解決方案,存在以下缺點(diǎn)A、僅能針對運(yùn)行狀態(tài)可以到達(dá)的區(qū)域進(jìn)行修改,而不能增加新的區(qū)域。如,僅支持對方法body的修改,不支持增加方法,修改方法名,方法參數(shù)等操作。對于熱部署來說,無法做到全部代碼的熱部署,特別是經(jīng)常性的操作,比如增加方法,增加內(nèi)部類,修改方法名等等;會嚴(yán)重影響熱部署方法的應(yīng)用范圍,具有一定的局限性。B、Hotswap提供的熱部署比較復(fù)雜,使用時(shí)會產(chǎn)生不穩(wěn)定的現(xiàn)象,有時(shí)會發(fā)生崩潰。C、通過此種解決方案實(shí)現(xiàn)熱部署時(shí)采用的工具的開發(fā)量極大,會增加開發(fā)復(fù)雜度。綜上所述,現(xiàn)有的解決方案均無法實(shí)現(xiàn)理想的Java應(yīng)用程序的熱部署,需要提供一種新的方案以克服現(xiàn)有方案的缺陷。
發(fā)明內(nèi)容
本申請?zhí)峁┮环NJava應(yīng)用程序的修改方法及裝置,用以在對Java應(yīng)用程序進(jìn)行修改的過程中,降低操作流程的復(fù)雜度,提高其執(zhí)行效率。本申請?zhí)峁┑木唧w技術(shù)方案如下一種Java應(yīng)用程序的更新方法,包括確定存在至少一個編譯生成的目標(biāo)類文件;在指定存儲位置獲取所述至少一個目標(biāo)類文件;針對獲取的至少一個目標(biāo)類文件建立相應(yīng)的類加載程序,采用所述類加載程序?qū)⑺鲋辽僖粋€目標(biāo)類文件加載至運(yùn)行狀態(tài)的Java應(yīng)用程序中;其中,所述類加載程序繼承當(dāng)前的環(huán)境加載程序。一種用于Java應(yīng)用程序更新的裝置,包括掃描單元,用于確定存在至少一個編譯生成的目標(biāo)類文件;獲取單元,用于在指定存儲位置獲取所述至少一個目標(biāo)類文件;處理單元,用于針對獲取的至少一個目標(biāo)類文件建立相應(yīng)的類加載程序,采用所述類加載程序?qū)⑺鲋辽僖粋€目標(biāo)類文件加載至運(yùn)行狀態(tài)的Java應(yīng)用程序中;其中,所述類加載程序繼承當(dāng)前的環(huán)境加載程序。本申請實(shí)施例中,開發(fā)了新的熱部署工具,通過新建的繼承當(dāng)前環(huán)境classloader 的eas於tartClassLoader,在指定存儲位置加載目標(biāo)類文件,并將其加載至運(yùn)行狀態(tài)的 Java應(yīng)用程序中,從而完成Java應(yīng)用程序的更新,這樣,只需加載重新編譯的目標(biāo)類文件, 便實(shí)現(xiàn)了 Java應(yīng)用程序的熱部署,從而提高了 Java應(yīng)用程序的更新效率。
圖1為本申請實(shí)施例中TOB服務(wù)器工作原理示意圖;圖2為本申請實(shí)施例中WEB服務(wù)器功能結(jié)構(gòu)圖;圖3為本申請實(shí)施例中WEB服務(wù)器對運(yùn)行狀態(tài)的Java應(yīng)用程序進(jìn)行更新流程圖。
具體實(shí)施例方式參閱圖1所示,在對Java應(yīng)用程序進(jìn)行修改的過程中,為了降低操作流程的復(fù)雜度,提高其執(zhí)行效率,本申請實(shí)施例中,研發(fā)了一種新的熱部署工具,較佳的,該熱部分工具在運(yùn)行時(shí)所采用的WEB服務(wù)器為Jboss,采用的代碼開發(fā)環(huán)境(即代碼編輯器)為 eclipse,而本申請實(shí)施例不限于Jboss和eclipse兩種實(shí)現(xiàn)方式,此處僅為舉例,這里只是示例性的說明如圖1所示,現(xiàn)有技術(shù)下,當(dāng)開發(fā)人員編寫完源代碼,會使用antx/maven等編譯工具對源代碼進(jìn)行編譯封裝,并最終生成軟件產(chǎn)品(如,一個可運(yùn)行的Java應(yīng)用程序);接著,開發(fā)人員將該軟件產(chǎn)品部署到Jboss上,再啟動JvmCJavaVirtual Machine, Java虛擬機(jī)),由Jvm啟動Jboss,再由Jboss啟動軟件產(chǎn)品(包括啟動應(yīng)用框架,由應(yīng)用框架啟動軟件產(chǎn)品的應(yīng)用代碼);此時(shí),開發(fā)人員向Jboss發(fā)送一個執(zhí)行命令,可以看到相應(yīng)的執(zhí)行效果。如果根據(jù)執(zhí)行效果發(fā)現(xiàn)需要對源代碼進(jìn)行修改,那么開發(fā)人員需要關(guān)閉Jboss,并重復(fù)上述源代碼修改、編譯封裝過程,將根據(jù)修改后的源代碼生成的軟件產(chǎn)品再次部署到Jboss 上,再重新啟動Jboss以運(yùn)行修改后的軟件產(chǎn)品。這一過程需要較長時(shí)間,會降低Java應(yīng)用程序的修改效率,從而影響整個服務(wù)系統(tǒng)的性能。與普通程序不同,Java程序(.class文件)并不是本地的可執(zhí)行程序。當(dāng)需要運(yùn)行.class文件時(shí),首先應(yīng)運(yùn)行JvmCJava虛擬機(jī)),然后再把.class文件加載到Jvm中運(yùn)行,負(fù)責(zé)加載.class文件的工具就叫做classloader,而Jvm在加載過程中使用的接口稱為 Jvmti接口。本申請實(shí)施例中,重新設(shè)計(jì)的熱部署工具中,重新定義了 Jvmti接口的功能,替換了 Jvm中原有的框架代碼,這樣,啟動Jvm時(shí),Jvm根據(jù)改變后的框架代碼會自動重新創(chuàng)建一個classloader (稱為fes於tartClassLoader),直接在指定存儲位置獲取最新編譯生成的.class文件,其中,Jvmti接口 如圖1所示,在原有框架(也可以稱為應(yīng)用框架)運(yùn)行時(shí),Jboss—般通過運(yùn)行環(huán)境中的classLoader去獲取本地軟件產(chǎn)品中包含的應(yīng)用代碼,而本申請實(shí)施例中,通過重新定義Jvmti接口,改變了原有框架的行為,使Jboss每次調(diào)用目標(biāo).class文件時(shí),到指定存儲位置獲取最新編譯生成的目標(biāo).class文件,所謂指定存儲位置,可以是開發(fā)人員指定的代碼編輯器中的編譯目標(biāo)文件夾。實(shí)際應(yīng)用中,也可以不從代碼編輯器中獲取目標(biāo).class文件,例如,通過命令行調(diào)用Jvm指令直接編譯生成一個目標(biāo).class文件,或者,從其它指定位置拷貝一個編譯生成的新的目標(biāo).class等等,其目的在于獲取一個目標(biāo).class文件并熱部署到運(yùn)行狀態(tài)的 Java應(yīng)用程序中,并不限制目標(biāo).class文件的來源。以下實(shí)施例中,以在代碼編輯器中的指定存儲裝置獲取目標(biāo).class文件為例進(jìn)行說明。EasyStartClassLoader : gfe · classclassloader,
施例中,在創(chuàng)建fesyMartClassLoader時(shí),顛倒了 classLoader的常規(guī)的雙親委派的機(jī)制 (classLoader 力口i,#由〒 classLoader ^ ) ,^Μτ^ EasyStartClassLoader 加載,再由EasyStartClassLoader的父classLoader加載的方式,同時(shí)將該父classLoader 設(shè)成環(huán)境classLoader,并通過限定EasyMartClassLoader只能加載目標(biāo).class文件,來保證與目標(biāo).class文件相關(guān)的其他.class文件或者.class文件庫由環(huán)境classLoader加載。其中,所謂環(huán)境classLoader即是當(dāng)前環(huán)境的創(chuàng)建者,所謂環(huán)境,即是指當(dāng)前的運(yùn)行狀態(tài),即一組代碼運(yùn)行的狀態(tài),加載這一組代碼的classLoader即是當(dāng)前環(huán)境classLoader。在加載過程中,一般通過Java中的接口或者Java反射機(jī)制的方式,來使外部環(huán)境可以正常使用easyMartClassLoader加載的目標(biāo).class文件,從而實(shí)現(xiàn)在運(yùn)行態(tài),自動調(diào)用最新加載的目標(biāo).class文件來運(yùn)行,并得到即時(shí)結(jié)果。以代碼編輯器是eclipse為例,開發(fā)人員修改部分代碼后,eclipse會把修改部分的代碼文件編譯成新的.class文件,即目標(biāo).class文件;由于是編譯單個文件,因此速度極快,可以忽略編譯時(shí)間;接著,通過使用被JVM的jvmti接口處理過的框架(即重新定義的框架),定期進(jìn)行文件掃描,確定eclipse中指定的文件夾內(nèi)存在重新編譯生成的目標(biāo).class文件時(shí),便在該指定的文件夾內(nèi)獲取新生成的目標(biāo).class文件,這個過程速度也很快,可以忽略時(shí)間。下面結(jié)合附圖對本申請優(yōu)選的實(shí)施方式進(jìn)行詳細(xì)說明。參閱圖2所示,本申請實(shí)施例中,用于對Java應(yīng)用程序進(jìn)行更新的裝置(如,WEB 服務(wù)器)包括掃描單元10、獲取單元11和處理單元12,其中掃描單元10,用于在指定存儲位置進(jìn)行掃描,確定生成了重新編譯的目標(biāo)類文件, 即目標(biāo).class文件;本發(fā)明實(shí)施例中,由于在代碼編輯器中獲取目標(biāo).class文件,因此,需要采用掃描單元10定期進(jìn)行文件掃描,以確定存在目標(biāo).class文件,實(shí)際應(yīng)用中,若是根據(jù)Jvm命令直接編譯生成目標(biāo).class文件,或者根據(jù)指示從其他位置拷貝目標(biāo).class文件,則也可以不采用掃描單元10,在此不再贅述;獲取單元11,用于獲取至少一個目標(biāo)類文件,即目標(biāo).class文件;本實(shí)施例中,獲取單元11在指定存儲位置獲取目標(biāo).class文件,其原因是Jvm采用的框架使用的是重新設(shè)計(jì)的Jvmti接口,框架行為發(fā)生了改變。處理單元12,用于針對獲取的至少一個目標(biāo)類文件建立相應(yīng)的類加載程序,即eas於tartClassLoader,并采用該類加載程序?qū)@取的至少一個目標(biāo)類文件加載至運(yùn)行狀態(tài)的Java應(yīng)用程序中;其中,類加載程序繼承當(dāng)前的環(huán)境加載程序,即 easyStartClassLoader 7 C^ IU"W^F^ classloder。本實(shí)例中,掃描單元10獲取單元11和處理單元12,是通過Jvm的重新設(shè)計(jì)的 Jvmti接口,在不改變原框架代碼的情況下,嵌入原有框架邏輯,并且生效運(yùn)行的。上述TOB服務(wù)器中需支持Jvm,較佳的,上述TOB服務(wù)器為Jboss,或者為tomcat?;谏鲜鱿到y(tǒng)架構(gòu),參閱圖3所示,本申請實(shí)施例中,以在eclipse中編譯目標(biāo).class文件為例,介紹TOB服務(wù)器對運(yùn)行狀態(tài)的Java應(yīng)用程序進(jìn)行更新的詳細(xì)流程如下步驟300 確定代碼編輯器(如,eclipse)中存在至少一個編譯生成的目標(biāo)類文件,即目標(biāo).class文件。步驟310 在代碼編輯器內(nèi)的指定存儲位置獲取上述至少一個目標(biāo)類文件。本申請實(shí)施例中,在執(zhí)行步驟310時(shí),WEB服務(wù)器支持的Jvm通過新定義的Jvmti 接口改變了 Jvm中運(yùn)行的原有框架的行為,令改變后的框架可以在eclipse的指定存儲位置(如,eclipse默認(rèn)將目標(biāo).class文件編譯到文件夾target/classes/目錄下),獲取開發(fā)人員新編譯的目標(biāo).class文件,目標(biāo).class文件的數(shù)目可以是一個,也可以是多個?,F(xiàn)有技術(shù)下,Jvm在配置使用jvmti接口后,Jvm在加載每個· class文件時(shí),均會通過Jvmti接口調(diào)用,并且可以通過Jvmti接口對.class文件的字節(jié)碼進(jìn)行修改,現(xiàn)有的 Jvmti接口的實(shí)現(xiàn)代碼如下byte []transform(ClassLoader loader,
Stringc IassName,Class< ? >cIassBeingRedefined,ProtectionDomain protectionDomain,byte[]classf ileBuffer)throws IllegalClassFormatException ;現(xiàn)有技術(shù)下通過Jvmti接口調(diào)用.class文件是從框架的代碼中獲取,在上述代碼中,loader為裝載被調(diào)用的.class文件的classloader,className為被調(diào)用的.class文件的名稱,classBeingRedf ined為被調(diào)用的.class文件的類型,protectionDomain為被調(diào)用的.class文件的作用域,classfileBuffer為Jvm讀取到的字節(jié)碼。通常情況下,可以根據(jù)classfileBuffer讀取到的字節(jié)碼來進(jìn)行分析,然后改變字節(jié)碼的內(nèi)容,并返回給Jvm, Jvm將運(yùn)行改變后的字節(jié)碼,從而達(dá)到改變框架行為的目的,而實(shí)際上原先使用的代碼并沒有改變,于是在不改變原先使用的代碼,即在無侵入的情況下,改變了框架的原有運(yùn)行方式。但是分析并改變字節(jié)碼,需要開發(fā)人員對Java編譯類文件的機(jī)制非常了解,對.class 文件的機(jī)制非常了解,因此,按照上述方式即使達(dá)到了改變Jvm調(diào)用.class文件的原有方式的目的,也需要相當(dāng)?shù)墓ぷ髁?。本申請?shí)施例中,為了減少實(shí)現(xiàn)上述目的的工作量,將需要改變的.class文件導(dǎo)入代碼編輯器(如,eclipse)中,按照實(shí)際需求自定義改變類的運(yùn)行方式,保存后,代碼編輯器自動編譯生成目標(biāo).class文件,相應(yīng)地,Jvm通過jvmti接口,只需檢驗(yàn)代碼編輯器中的className,確定是需要替換的.class文件時(shí),就直接獲取編譯完成的目標(biāo).class文件的字節(jié)碼,而不用去分析并修改classfileBuffer中的字節(jié)碼,這樣,便大大降低了采用原有Jvmti接口的使用方式所需的工作量。本申請實(shí)施例中,實(shí)現(xiàn)Jvmti接口調(diào)用的執(zhí)行代碼如下String targetName = "targetClass,,;if(className. equals(targetName)){return Transformer. getBytesFromFile(targetName);}return null ;其中,getBytesFromFile (targetName所定義的方法只是返回目標(biāo).class的文件流而已,步驟320 針對獲取的至少一個.class文件建立相應(yīng)的easyMartClassLoader, 采用該easyMartClassLoader將獲取的至少一個.class文件加載至運(yùn)行狀態(tài)的Java應(yīng)用程序中,其中,上述easyStartClassLoader繼承當(dāng)前環(huán)境classLoader。本申請實(shí)施例中,上述easyMartClassLoader的功能是加載代碼編輯器中編碼生成的指定的目標(biāo).class文件,較佳的,針對重新編譯生成的目標(biāo).class 文件可建立至少一個easyStartClassLoader,如,針對每一個目標(biāo)· class文件分別建立一個easyMartClassLoader,也可以針對多個目標(biāo).class文件建立一個 easyMartClassLoader,并且要將加載的目標(biāo).class文件返回給Jvm中的運(yùn)行狀態(tài)的Java 應(yīng)用程序,令Java應(yīng)用程序可以采用新加載的目標(biāo).class文件進(jìn)行運(yùn)作。本申請實(shí)施例中,要實(shí)現(xiàn)上述功能,存在以下難點(diǎn)
首先,一個classLoader加載了某個.class文件后,就不能再重新加載這個.class文件,必須重新建立一個classLoader才能重新加載這個.class文件;其次,不同的classLoader加載的.class文件是不能相互使用的,即使新建了 easyMartClassLoader,加載了目標(biāo).class文件,該.class文件也無法讓之前已建立的 classLoader iJM ;再次,easyStartClassLoader加載的.class文件大量依賴當(dāng)前的環(huán)境類和類庫, 這些需要由環(huán)境classLoader加載,而不能由easyStartClassLoader加載。針對上述問題,本申請實(shí)施例中采用了以下方式加以解決每次都創(chuàng)建新的 easyStartClassLoader,新創(chuàng)建的 eas於tartClassLoader 繼 ^ IU" ^F M classLoader (艮口 {乍為 easyStartLoader 的義 classLoader) ; # i 真頁 flj J
ClassLoader的雙親委派的機(jī)制,即先由eas於tartClassLoader加載目標(biāo)· class文件, 再交由其繼承的環(huán)境classLoader處理;同時(shí)通過限定加載項(xiàng)的辦法,保證安全,即限定 easyStartClassLoader只能加載指定存儲位置的目標(biāo).class文件,其它相關(guān)的.class文件全部交由其繼承的環(huán)境classLoader加載。其中,所謂環(huán)境classLoader即是當(dāng)前環(huán)境的創(chuàng)建者,所謂環(huán)境,即是指當(dāng)前的運(yùn)行狀態(tài),即一組代碼運(yùn)行的狀態(tài),加載這一組代碼的 classLoader 艮口是當(dāng)前環(huán)境 classLoader。具體為現(xiàn)有技術(shù)下,classLoader的實(shí)現(xiàn)代碼舉例如下protected synchronized Class< ? >loadClass (String name, boolean resolve)throws ClassNotFoundException{//First, check if the class has already been loadedClass c = findLoadedClass(name);if (c == null) {try {if (parent ! = null) {c = parent. IoadClass (name, false);}else{c = findBootstrapClassO(name);}}catch(ClassNotFoundException e){//If still not found, then invoke findClass in order//to find the class.c = f indClass (name);}}if (resolve) {resolveClass (c);
}return c ;}從上述代碼中可以看出,classloader存在兩個特性第一個特性為一旦加載了一個.class文件(稱為類A),就不再去讀取其字節(jié)碼。因此,本實(shí)施例中,針對類A進(jìn)行重新編譯生成類A’后,必須新建一個 easyStartClassLoader 去讀取并力口載類 A,。第二個特性為優(yōu)先讓父classLoader加載.class文件,如果父classLoader可以加載這個.class文件,就不再由子classLoader加載這個.class文件。因此,本實(shí)施例中,需要顛倒雙親委派機(jī)制,針對重新編碼生成的類A’,先由新建的 easyStartClassLoader 力口classLoader (艮口 easyStartClassLoader
環(huán)境classLoader)加載其他相關(guān)的.class文件。與現(xiàn)有技術(shù)不同,本申請實(shí)施例中,easyStartLoader實(shí)現(xiàn)代碼舉例如下public synchronized Class< ? >loadClass(String name)throwsClassNotFoundException{Class< ? >c = findLoadedClass(name);if (c ! = null) {return c ;}try {if (name. indexOf (targetClass) = = -1) {throw new Exception(" easyStartClassLoader escaped:" +name);}c = this, f indClass (name);System, out. println( " easyStartClassLoader loaded:" +name);} catch (Exception e) {c = super. IoadClass (name);}return c ;} 從上述代碼可以看出,easyStartClassLoader只需要繼承當(dāng)前環(huán)境classLoader,
成為當(dāng)前環(huán)境classLoader的子classLoader,這樣,目標(biāo).class文件(即重新編譯后的至少一個.class文件)所依賴的其他相關(guān)的.class文件則均可由環(huán)境classLoader加載, 并且環(huán)境classLoader無法加載目標(biāo).class文件,即在限定加載項(xiàng)(即目標(biāo).class文件) 的前提下,顛倒雙親委派的機(jī)制,讓子classLoader (即easyMartLoader)先加載,再由環(huán)境classLoader加載,但easyMartLoader只加載目標(biāo).class文件,其他相關(guān)的.class文件還是由環(huán)境classLoader加載?;谏鲜鰧?shí)施例,在將目標(biāo).class文件加載至運(yùn)行狀態(tài)的Java應(yīng)用程序的過程中,一般通過java中的接口或者Java反射機(jī)制的方式,來令外部環(huán)境可以調(diào)用新加載的目標(biāo).class文件。所謂Java中的接口是一系列方法的聲明,是一些方法特征的集合,一個Java中的接口只有方法的特征沒有方法的實(shí)現(xiàn),因此這些方法可以在不同的地方被不同的類實(shí)現(xiàn), 而這些實(shí)現(xiàn)可以具有不同的行為(即功能)。Java中的接口事實(shí)上由環(huán)境classLoader 加載,但easyMartClassLoader因?yàn)槔^承環(huán)境classLoader所以也可以訪問到,由于 easyStartClassLoader加載的一個或一組目標(biāo).class文件也是繼承Java中的接口的,所以在外部環(huán)境中,被加載的一個或一組目標(biāo).class文件在被實(shí)例化后,通過強(qiáng)轉(zhuǎn)成java中的接口來被使用。本實(shí)施例中,在外部環(huán)境中使用被easyMartClassLoader加載的一個或一組.class文件的實(shí)現(xiàn)代碼舉例如下ClassLoader classloader = newEasyStartClassLoader (new URL [] {url}, moduleClassName);moduleClass =classloader. IoadClass(moduleClassName);module = (Module) moduleClass. newlnstance ();通過上述代碼可以看出,本實(shí)施例中,被easyMartLoader加載的一個或一組目標(biāo).class文件(以下稱為被加載的模塊)實(shí)現(xiàn)了使用Java中的接口,同時(shí),還保證 T Java Φ StJii π # ^ easyStartClassLoader classLoader ^^F^ classLoader 加載,而非easyMartClassLoader加載,這是為了讓環(huán)境classLoader可以使用 easyStartClassLoader加載的模塊,因?yàn)橐话闱闆r下,不同classLaoder加載的模塊是不能通用的。這樣,easyStartClassLoader繼承上述環(huán)境classLoader,便可以令自身加載的模塊訪問到環(huán)境classLoader加載的Java中的接口,從而令外部環(huán)境可以通過上述Java 中的接口來調(diào)用eas於tartClassLoader加載的模塊。其中,所謂外部環(huán)境,即是指相對于 easyStartClassLoader加載的環(huán)境,調(diào)用easyMartClassLoader加載的環(huán)境的環(huán)境稱之為外部環(huán)境。另一方面,所謂的Java反射機(jī)制(稱為Reflection),即是在Java應(yīng)用程序運(yùn)行時(shí),允許加載、探知、使用編譯期間完全未知的.class文件,換句話說,Java應(yīng)用程序可以加載一個運(yùn)行時(shí)才得知名稱的.class文件,獲悉其完整構(gòu)造,并生成其對象實(shí)體。例如, Java反射機(jī)制為Class. getMethod (). invoke (),采用Java反射機(jī)制,對于任意一個.class 文件,都能夠知道其所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法; 因此,采用Java反射機(jī)制,可以在Java應(yīng)用程序加載目標(biāo).class文件后,令外部環(huán)境也能夠調(diào)用該目標(biāo).class文件。最后,Jvm按照重新加載的.class文件執(zhí)行Java應(yīng)用程序,便可以使用新加載的.class文件具有的功能。本申請實(shí)施例中,開發(fā)了新的熱部署工具,通過新建的繼承當(dāng)前環(huán)境classloader 的eas於tartClassLoader,在指定存儲位置加載目標(biāo)類文件,并將其加載至運(yùn)行狀態(tài)的Java應(yīng)用程序中,從而完成Java應(yīng)用程序的更新,這樣,只需加載重新編譯的目標(biāo)類文件,便實(shí)現(xiàn)了 Java應(yīng)用程序的熱部署,提高了 Java應(yīng)用程序的更新效率;而且, easyStartClassLoader的原理結(jié)構(gòu)簡單,具有很高的穩(wěn)定性,也不會增加內(nèi)存消耗和額外的系統(tǒng)消耗,可以無限次快速無代價(jià)實(shí)現(xiàn)熱部署,具有很高的實(shí)用性;進(jìn)一步地,新的熱部署工具的核心代碼可以根據(jù)Java應(yīng)用框架和應(yīng)用狀態(tài),以極少的開發(fā)量作出擴(kuò)展,可以做到全代碼全操作的熱部署,具有廣泛的應(yīng)用范圍。 顯然,本領(lǐng)域的技術(shù)人員可以對本申請進(jìn)行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本申請的這些修改和變型屬于本申請權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本申請也意圖包含這些改動和變型在內(nèi)。
權(quán)利要求
1.一種Java應(yīng)用程序的更新方法,其特征在于,包括獲取至少一個編譯生成的目標(biāo)類文件;針對獲取的至少一個目標(biāo)類文件建立相應(yīng)的類加載程序,采用所述類加載程序?qū)⑺鲋辽僖粋€目標(biāo)類文件加載至運(yùn)行狀態(tài)的Java應(yīng)用程序中;其中,所述類加載程序繼承當(dāng)前的環(huán)境加載程序。
2.如權(quán)利要求1所述的方法,其特征在于,針對獲取的至少一個目標(biāo)類文件建立相應(yīng)的類加載程序,包括若獲取的目標(biāo)類文件的數(shù)目為一個,則對應(yīng)該目標(biāo)類文件建立相應(yīng)的類加載程序;若獲取的目標(biāo)類文件的數(shù)目為一個以上,則對應(yīng)各目標(biāo)類文件建立至少一個類加載程序。
3.如權(quán)利要求1或2所述的方法,其特征在于,采用所述類加載程序?qū)⑺鲋辽僖粋€目標(biāo)類文件加載至運(yùn)行狀態(tài)的Java應(yīng)用程序中,包括先采用所述類加載程序?qū)λ鲋辽僖粋€目標(biāo)類文件進(jìn)行加載;再采用所述環(huán)境加載程序?qū)εc所述目標(biāo)類文件相關(guān)的其他類文件進(jìn)行加載。
4.如權(quán)利要求3所述的方法,其特征在于,采用所述類加載程序?qū)⑺鲋辽僖粋€目標(biāo)類文件加載至運(yùn)行狀態(tài)的Java應(yīng)用程序中,進(jìn)一步,包括采用所述類加載程序繼承所述環(huán)境加載程序加載的全部Java中的接口,令外部環(huán)境能夠通過所述Java中的接口調(diào)用所述至少一個目標(biāo)類文件。
5.如權(quán)利要求3所述的方法,其特征在于,采用所述類加載程序?qū)⑺鲋辽僖粋€目標(biāo)類文件加載至運(yùn)行狀態(tài)的Java應(yīng)用程序中,進(jìn)一步,包括采用Java反射機(jī)制,令外部環(huán)境能夠調(diào)用所述至少一個目標(biāo)類文件。
6.一種用于Java應(yīng)用程序更新的裝置,其特征在于,包括獲取單元,用于獲取至少一個編譯生成的目標(biāo)類文件;處理單元,用于針對獲取的至少一個目標(biāo)類文件建立相應(yīng)的類加載程序,采用所述類加載程序?qū)⑺鲋辽僖粋€目標(biāo)類文件加載至運(yùn)行狀態(tài)的Java應(yīng)用程序中;其中,所述類加載程序繼承當(dāng)前的環(huán)境加載程序。
7.如權(quán)利要求6所述的裝置,其特征在于,所述處理單元針對獲取的至少一個目標(biāo)類文件建立相應(yīng)的類加載程序,包括若獲取的目標(biāo)類文件的數(shù)目為一個,則所述處理單元對應(yīng)該目標(biāo)類文件建立相應(yīng)的類加載程序;若獲取的目標(biāo)類文件的數(shù)目為一個以上,則所述處理單元對應(yīng)各目標(biāo)類文件建立至少一個類加載程序。
8.如權(quán)利要求6或7所述的裝置,其特征在于,所述處理單元采用所述類加載程序?qū)⑺鲋辽僖粋€目標(biāo)類文件加載至運(yùn)行狀態(tài)的Java應(yīng)用程序中,包括先采用所述類加載程序?qū)λ鲋辽僖粋€目標(biāo)類文件進(jìn)行加載;再采用所述環(huán)境加載程序?qū)εc所述目標(biāo)類文件相關(guān)的其他類文件進(jìn)行加載。
9.如權(quán)利要求7所述的裝置,其特征在于,所述處理單元采用所述類加載程序?qū)⑺鲋辽僖粋€目標(biāo)類文件加載至運(yùn)行狀態(tài)的Java應(yīng)用程序中,進(jìn)一步,包括采用所述類加載程序繼承所述環(huán)境加載程序加載的全部Java中的接口,令外部環(huán)境能夠通過所述Java中的接口調(diào)用所述至少一個目標(biāo)類文件。
10.如權(quán)利要求6所述的裝置,其特征在于,所述處理單元采用所述類加載程序?qū)⑺鲋辽僖粋€目標(biāo)類文件加載至Java應(yīng)用程序中,進(jìn)一步,包括采用Java反射機(jī)制,令外部環(huán)境能夠調(diào)用所述至少一個目標(biāo)類文件。
全文摘要
本申請公開了一種Java應(yīng)用程序的更新方法及裝置,用于提高Java應(yīng)用程序的更新效率。該方法為獲取至少一個目標(biāo)類文件,并針對獲取的至少一個目標(biāo)類文件建立相應(yīng)的類加載程序,在Java應(yīng)用程序運(yùn)行過程中,采用所述類加載程序?qū)⑺鲋辽僖粋€目標(biāo)類文件加載至運(yùn)行狀態(tài)的Java應(yīng)用程序中;其中,所述類加載程序繼承當(dāng)前的環(huán)境加載程序。這樣,只需加載重新編譯的目標(biāo)類文件,便實(shí)現(xiàn)了Java應(yīng)用程序的熱部署,從而提高了Java應(yīng)用程序的更新效率。本發(fā)明同時(shí)提供了相應(yīng)的裝置。
文檔編號G06F9/445GK102402427SQ20101027995
公開日2012年4月4日 申請日期2010年9月9日 優(yōu)先權(quán)日2010年9月9日
發(fā)明者楊航 申請人:阿里巴巴集團(tuán)控股有限公司