JavaEE應(yīng)用類加載沖突分析方法和裝置的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機應(yīng)用技術(shù)領(lǐng)域,尤其涉及一種JavaEE應(yīng)用類加載沖突分析方法和裝置。
【背景技術(shù)】
[0002]Java應(yīng)用程序的執(zhí)行通常依賴于多個jar文件和Java虛擬機(Java VirtualMachine,簡稱JVM),其中,jar文件包括類文件(后綴為.class的文件),而且類文件需要加載到JVM中才能運行。
[0003]在JVM中負責(zé)加載類文件的組件稱為類加載器,JVM本身包含了一個類加載器,稱為引導(dǎo)類加載器,引導(dǎo)類加載器是用本地代碼實現(xiàn)的,它負責(zé)加載Java的核心類,如Java_home/jre/rt.jar (Java_home為JDK的安裝目錄)中的類,除了引導(dǎo)類加載器之外,JVM還提供了兩個類加載器,分別為擴展類加載器和系統(tǒng)類加載器,它們均用Java語言實現(xiàn)的,其中,擴展類加載器負責(zé)加載Java的擴展類,如Java_home/jre/lib/ext目錄下jar文件中的類,系統(tǒng)類加載器負責(zé)加載應(yīng)用程序自身需要的類,如通過“-classpath”參數(shù)指定的類和系統(tǒng)環(huán)境變量“CLASSPATH”指定的類。除了引導(dǎo)類加載器之外,每個類加載器都可以設(shè)置其父類加載器,最高級的父類加載器為引導(dǎo)類加載器,這樣就可以形成一個類加載器鏈。
[0004]JVM默認采用的類加載模型是父優(yōu)先加載模型,也叫委托模型或雙親委派模型,在這種模型下,子類加載器在加載一個類的時候首先委托父類加載器來加載,以此類推,如果所有的父類加載器都不能加載到,那么子類加載器再進行加載。另外,JVM也提供了自定義類加載器,自定義類加載器在加載類的時候可以不按照父優(yōu)先加載模型來進行,例如子類加載器可以優(yōu)先加載,如果加載不到再由父類加載器加載,這樣的類加載模型稱為子優(yōu)先加載模型。JavaEE應(yīng)用服務(wù)器既支持父優(yōu)先加載模型也支持子優(yōu)先加載模型。
[0005]在JVM中,一個類加載器會對已經(jīng)加載過的類作緩存處理,在加載一個類的時候先在緩存中查找是否已經(jīng)加載過,如果已經(jīng)加載過則不再進行加載,如果沒有加載過則再進行加載,即同一個類只會被加載一次;同時,不同的類加載器各自管理已加載過類的緩存,這些緩存對其它類加載器是不可見的。
[0006]在對現(xiàn)有技術(shù)的研宄和實踐過程中,發(fā)明人發(fā)現(xiàn)現(xiàn)有技術(shù)中至少存在如下技術(shù)問題:
I)由于同一個類只會被加載一次,在JavaEE應(yīng)用的類路徑中不同jar文件存在類全名相同的類的情況下,不能保證能夠加載到預(yù)期的類,這樣就會導(dǎo)致Java程序運行出錯,例如,對于一個JavaEE應(yīng)用的類路徑中一個jar文件的多個版本,程序加載了不正確的版本會導(dǎo)致程序運行出錯。
[0007]2)由于不同類加載器管理的已加載類的緩存對其它類加載器不可見,那么就有可能出現(xiàn)同一個類被多次加載的現(xiàn)象,例如,一個JavaEE應(yīng)用的類加載器采用子優(yōu)先類加載,即在加載類時優(yōu)先從自身類路徑中加載,如果能夠加載則進行加載,而恰好父類加載器也已經(jīng)加載過此類,這就出現(xiàn)了同一個類被多個類加載器多次加載的現(xiàn)象,而在JVM中認為不同類加載器加載的類為不同的類,即這些類的類型是不兼容的,從而使得在類型轉(zhuǎn)換等操作中導(dǎo)致程序運行出錯。
[0008]3)由于JVM不會立即加載類路徑中的全部類,而是在程序運行時根據(jù)需要來加載的,這樣由類加載導(dǎo)致程序運行出錯并不會立即暴露,從而形成了程序運行中的潛在風(fēng)險。
[0009]由此可見,現(xiàn)有的JavaEE應(yīng)用類加載機制存在潛在的類加載沖突風(fēng)險,而且定位潛在的沖突類并不是很容易的,尤其是在JavaEE應(yīng)用中包含了大量的jar文件的情況下,定位潛在沖突類會更加困難。
【發(fā)明內(nèi)容】
[0010]本發(fā)明提供一種JavaEE應(yīng)用類加載沖突分析方法和裝置,能夠?qū)崿F(xiàn)對JavaEE應(yīng)用程序運行中潛在的類加載沖突風(fēng)險的全面分析,以及時確定潛在的沖突類。
[0011]一方面,本發(fā)明提供一種JavaEE應(yīng)用類加載沖突分析方法,所述方法包括: 獲取待分析應(yīng)用對應(yīng)的類加載器鏈;
基于所述類加載器鏈,對所述待分析應(yīng)用的所有非重復(fù)類文件進行沖突分析,以確定潛在的沖突類。
[0012]另一方面,本發(fā)明提供一種JavaEE應(yīng)用類加載沖突分析裝置,所述裝置包括類加載器管理模塊和類加載沖突分析模塊,其中,
所述類加載器管理模塊,用于獲取待分析應(yīng)用對應(yīng)的類加載器鏈;
所述類加載沖突分析模塊,用于基于所述類加載器鏈,對所述待分析應(yīng)用的所有非重復(fù)類文件進行沖突分析,以確定潛在的沖突類。
[0013]本發(fā)明提供的JavaEE應(yīng)用類加載沖突分析方法和裝置,獲取待分析應(yīng)用對應(yīng)的類加載器鏈;基于所述類加載器鏈,對所述待分析應(yīng)用的所有非重復(fù)類文件進行沖突分析,以確定潛在的沖突類。與現(xiàn)有技術(shù)相比,其能夠基于所述類加載器鏈,實現(xiàn)對JavaEE應(yīng)用程序運行中加載的類文件進行全面地分析,以便于及時發(fā)現(xiàn)潛在的沖突類,進而避免了不必要的應(yīng)用程序運行錯誤,提高了應(yīng)用程序運行的穩(wěn)定性。
【附圖說明】
[0014]為了更清楚地說明本發(fā)明實施例中的技術(shù)方案,下面將對實施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其它的附圖。
[0015]圖1為本發(fā)明JavaEE應(yīng)用類加載沖突分析方法的一實施例流程示意圖;
圖2為本發(fā)明JavaEE應(yīng)用類加載沖突分析方法的另一實施例的流程圖;
圖3為上述實施例中的所述類加載器鏈的結(jié)構(gòu)示意圖;
圖4為本發(fā)明JavaEE應(yīng)用類加載沖突分析裝置的一實施例結(jié)構(gòu)示意圖;
圖5為本發(fā)明JavaEE應(yīng)用類加載沖突分析裝置的另一實施例結(jié)構(gòu)示意圖。
【具體實施方式】
[0016]下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其它實施例,都屬于本發(fā)明保護的范圍。
[0017]如圖1所示,本發(fā)明實施例提供一種JavaEE應(yīng)用類加載沖突分析方法,所述方法包括:
SI 1、獲取待分析應(yīng)用對應(yīng)的類加載器鏈。
[0018]S12、基于所述類加載器鏈,對所述待分析應(yīng)用的所有非重復(fù)類文件進行沖突分析,以確定潛在的沖突類。
[0019]本發(fā)明實施例提供的JavaEE應(yīng)用類加載沖突分析方法,獲取待分析應(yīng)用對應(yīng)的類加載器鏈;基于所述類加載器鏈,對所述待分析應(yīng)用的所有非重復(fù)類文件進行沖突分析,以確定潛在的沖突類。與現(xiàn)有技術(shù)相比,其能夠基于所述類加載器鏈,實現(xiàn)對JavaEE應(yīng)用程序運行中加載的類文件進行全面地分析,以便于及時發(fā)現(xiàn)潛在的沖突類,進而避免了不必要的應(yīng)用程序運行錯誤,提高了應(yīng)用程序運行的穩(wěn)定性。
[0020]如圖2所示,本發(fā)明實施例提供一種JavaEE應(yīng)用類加載沖突分析方法,所述方法包括:
S21、判斷待分析應(yīng)用的部署情況,若所述待分析應(yīng)用為已部署應(yīng)用,則執(zhí)行步驟S22和S23 ;若所述待分析應(yīng)用為未部署應(yīng)用,則執(zhí)行步驟S24。
[0021]S22、根據(jù)所述待分析應(yīng)用的名稱獲取對應(yīng)的應(yīng)用類加載器。
[0022]S23、基于所述應(yīng)用類加載器獲取所述待分析應(yīng)用對應(yīng)的類加載器鏈,并進入步驟S27。
[0023]S24、為所述待分析應(yīng)用創(chuàng)建應(yīng)用類加載器。
[0024]S25、根據(jù)所述待分析應(yīng)用的物理地址獲取所述待分析應(yīng)用包含的所有類文件,并將所述所有類文件添加到所述創(chuàng)建的應(yīng)用類加載器的類加載路徑中。
[0025]S26、根據(jù)JavaEE服務(wù)器提供的接口獲取公共類加載器,并設(shè)置所述創(chuàng)建的應(yīng)用類加載器的父類加載器為所述公共類加載器,以獲取所述獲取待分析應(yīng)用對應(yīng)的類加載器鏈。
[0026]其中,所述公共類加載為所述JavaEE服務(wù)器中所有已部署應(yīng)用的父加載器。
[0027]S27、解析步驟S23或S26得到的所述類加載器鏈,以獲取所述類加載器鏈上所有類加載器的類加載路徑和所述類加載路徑中所包含的類文件。
[0028]S28、對所述類加載路徑中所包含的類文件進行去重處理,以得到所述待分析應(yīng)用包含的所有非重復(fù)類文件。
[0029]可選地,若所述類加載路徑中為文件夾,則以遞歸方式獲取所述類加載路徑中所包含類文件;若所述類加載路徑中為jar文件,則以解壓方式獲取所述類加載路徑中所包含的類文件。
[0030]S29、針對所述所有非重復(fù)類文件,在所述類加載器鏈中所有類加載器的類加載路徑中進行查找操作,以得到所述潛在的沖突類和相應(yīng)的沖突信息,并對所述潛在的沖突類進行標記。
[0031]其中,所述沖突類為可以在至少兩個類加載路徑中查找到的非重復(fù)類文件,所述沖突信息包括所述沖突類可以被哪些類加載器加載以及所述沖突類可以從哪些類文件中加載。
[0032]由此可見,本發(fā)明實施例提供的JavaEE應(yīng)用類加載沖突分析方法是基于一條類加載器鏈,對待分析應(yīng)用包含的所有非重復(fù)類文件進行類加載沖突分析,以確定潛在的沖突類。其中,所述類加載器鏈的結(jié)構(gòu)如圖3所示,由圖3可知,對于對待分析應(yīng)用包含的所有非重復(fù)類文件,在JavaEE應(yīng)用類加載器31的類加載路徑、JavaEE服務(wù)器類加載器32的類加載路徑和Java虛擬機提供的三個類加載器的類加載路徑中進行類加載沖突分析,以確定潛在的沖突類,其中所述三個類加載器分別為JavaEE系統(tǒng)類加載器33、JavaEE擴展類加載器34和JavaEE引導(dǎo)類加載器35。與現(xiàn)有技術(shù)相比,其能夠基于所述類加載器鏈,實現(xiàn)對JavaEE應(yīng)用程序運行中加載的類文件進行全面地分析,以便于及時發(fā)現(xiàn)潛在的沖突類,進而避免了不必要的應(yīng)用程序運行錯誤,提高了應(yīng)用程序運行的穩(wěn)定性。
[0033]另外,本發(fā)明實施例對于已部署應(yīng)用和未部署應(yīng)用采用統(tǒng)一的處理方式,從而簡化了具體實施的復(fù)雜性。
[0034]如圖4所示,本發(fā)明實施例提供一種JavaE