本技術(shù)涉及計(jì)算機(jī),尤其涉及一種java應(yīng)用中未使用依賴識別方法及相關(guān)裝置。
背景技術(shù):
1、java項(xiàng)目在編譯時(shí)會將java項(xiàng)目運(yùn)行時(shí)所需要的依賴都打包進(jìn)jar包即java應(yīng)用中。jar包中的依賴可以分為實(shí)際使用依賴與未使用依賴兩種。實(shí)際使用依賴是在java應(yīng)用運(yùn)行過程中,java應(yīng)用實(shí)際會調(diào)用到的依賴;未使用依賴是java應(yīng)用運(yùn)行過程中,java應(yīng)用不會調(diào)用到依賴。
2、引入未使用依賴的原因可能有多種,最常見的比如在java應(yīng)用配置過程中錯(cuò)誤的引入依賴,或者在修改java應(yīng)用后未及時(shí)更新依賴。未使用依賴相當(dāng)于java應(yīng)用中的冗余部分,會導(dǎo)致一系列問題,例如java應(yīng)用啟動(dòng)時(shí)間變長,拖慢日常開發(fā);java應(yīng)用體積變大,拖慢項(xiàng)目部署等。
3、因此急需一種篩選java應(yīng)用中未使用依賴的方法,從而將java應(yīng)用中未使用依賴刪除,以實(shí)現(xiàn)減少java應(yīng)用體積,加快java應(yīng)用啟動(dòng)的目的。
技術(shù)實(shí)現(xiàn)思路
1、鑒于上述問題,本技術(shù)提供了一種java應(yīng)用中未使用依賴識別方法及相關(guān)裝置,以實(shí)現(xiàn)篩選java應(yīng)用中未使用依賴的方法的目的。具體方案如下:
2、本技術(shù)第一方面提供一種java應(yīng)用中未使用依賴識別方法,包括:
3、若檢測到啟動(dòng)java應(yīng)用的指令,獲取依賴分析agent存儲路徑;
4、其中,所述依賴分析agent包括agent代碼模塊、bridge代碼模塊以及core代碼模塊;其中,所述agent代碼模塊包括premain方法、調(diào)用所述bridge代碼模塊的調(diào)用接口以及預(yù)設(shè)的代碼模塊與類加載器的對應(yīng)關(guān)系;所述bridge代碼模塊包括調(diào)用所述core代碼模塊中靜態(tài)增強(qiáng)處理函數(shù)的調(diào)用接口、加載位置信息以及setbridge方法;所述靜態(tài)增強(qiáng)處理函數(shù)用于獲取在所述靜態(tài)增強(qiáng)處理函數(shù)的生命周期內(nèi)調(diào)用的依賴、調(diào)用依賴的途徑以及調(diào)用依賴的類加載器的名稱;所述加載位置信息包括所述agent代碼模塊加載至所述java應(yīng)用的每一方法的開始和結(jié)束;所述setbridge方法用于設(shè)置增強(qiáng)代碼;
5、從所述存儲路徑中獲取所述依賴分析agent;
6、從預(yù)設(shè)的代碼與類加載器的對應(yīng)關(guān)系中,查找所述agent代碼模塊對應(yīng)的applicationclassloader類加載器、所述bridge代碼模塊對應(yīng)的bootstrapclassloader類加載器、所述core代碼模塊對應(yīng)的profileragentclassloader類加載器;
7、其中,所述applicationclassloader類加載器與所述profileragentclassloader類加載器的父類為所述bootstrapclassloader類加載器;
8、通過所述applicationclassloader類加載器將所述java應(yīng)用加載至java虛擬機(jī)中;
9、通過所述profileragentclassloader類加載器將所述core代碼模塊加載至所述java虛擬機(jī)中;
10、通過所述bootstrapclassloader類加載器將所述bridge代碼模塊加載至所述java虛擬機(jī)中;
11、調(diào)用所述bridge代碼模塊中的setbridge方法,將所述agent代碼模塊轉(zhuǎn)換為增強(qiáng)代碼;
12、基于所述加載位置信息通過所述applicationclassloader類加載器將所述增強(qiáng)代碼注入至所述java虛擬機(jī)中所述java應(yīng)用中每一方法的開始和結(jié)束,以得到被測試應(yīng)用;
13、通過所述java虛擬機(jī)運(yùn)行所述被測試應(yīng)用;
14、若所述被測試應(yīng)用運(yùn)行完畢,獲取所述靜態(tài)增強(qiáng)處理函數(shù)獲得的依賴對應(yīng)關(guān)系,所述依賴對應(yīng)關(guān)系包括被調(diào)用的依賴的名稱、調(diào)用依賴的途徑以及調(diào)用依賴的類加載器的名稱的對應(yīng)關(guān)系;
15、從所述依賴對應(yīng)關(guān)系中獲取調(diào)用依賴的類加載器的名稱為所述applicationclassloader類加載器且調(diào)用依賴的途徑非所述依賴分析agent包含的代碼模塊的目標(biāo)依賴;
16、確定所述java應(yīng)用對應(yīng)的所有依賴除去所述目標(biāo)依賴外的依賴為未使用依賴。
17、本技術(shù)第二方面提供一種java應(yīng)用中未使用依賴識別裝置,包括:
18、第一獲取模塊,用于若檢測到啟動(dòng)java應(yīng)用的指令,獲取依賴分析agent存儲路徑;
19、其中,所述依賴分析agent包括agent代碼模塊、bridge代碼模塊以及core代碼模塊;其中,所述agent代碼模塊包括premain方法、調(diào)用所述bridge代碼模塊的調(diào)用接口以及預(yù)設(shè)的代碼模塊與類加載器的對應(yīng)關(guān)系;所述bridge代碼模塊包括調(diào)用所述core代碼模塊中靜態(tài)增強(qiáng)處理函數(shù)的調(diào)用接口、加載位置信息以及setbridge方法;所述靜態(tài)增強(qiáng)處理函數(shù)用于獲取在所述靜態(tài)增強(qiáng)處理函數(shù)的生命周期內(nèi)調(diào)用的依賴、調(diào)用依賴的途徑以及調(diào)用依賴的類加載器的名稱;所述加載位置信息包括所述agent代碼模塊加載至所述java應(yīng)用的每一方法的開始和結(jié)束;所述setbridge方法用于設(shè)置增強(qiáng)代碼;
20、第二獲取模塊,用于從所述存儲路徑中獲取所述依賴分析agent;
21、查找模塊,用于從預(yù)設(shè)的代碼與類加載器的對應(yīng)關(guān)系中,查找所述agent代碼模塊對應(yīng)的applicationclassloader類加載器、所述bridge代碼模塊對應(yīng)的bootstrapclassloader類加載器、所述core代碼模塊對應(yīng)的profileragentclassloader類加載器;
22、其中,所述applicationclassloader類加載器與所述profileragentclassloader類加載器的父類為所述bootstrapclassloader類加載器;
23、第一加載模塊,用于通過所述applicationclassloader類加載器將所述java應(yīng)用加載至java虛擬機(jī)中;
24、第二加載模塊,用于通過所述profileragentclassloader類加載器將所述core代碼模塊加載至所述java虛擬機(jī)中;
25、第三加載模塊,用于通過所述bootstrapclassloader類加載器將所述bridge代碼模塊加載至所述java虛擬機(jī)中;
26、轉(zhuǎn)換模塊,用于調(diào)用所述bridge代碼模塊中的setbridge方法,將所述agent代碼模塊轉(zhuǎn)換為增強(qiáng)代碼;
27、注入模塊,用于基于所述加載位置信息通過所述applicationclassloader類加載器將所述增強(qiáng)代碼注入至所述java虛擬機(jī)中所述java應(yīng)用中每一方法的開始和結(jié)束,以得到被測試應(yīng)用;
28、運(yùn)行模塊,用于通過所述java虛擬機(jī)運(yùn)行所述被測試應(yīng)用;
29、第三獲取模塊,用于若所述被測試應(yīng)用運(yùn)行完畢,獲取所述靜態(tài)增強(qiáng)處理函數(shù)獲得的依賴對應(yīng)關(guān)系,所述依賴對應(yīng)關(guān)系包括被調(diào)用的依賴的名稱、調(diào)用依賴的途徑以及調(diào)用依賴的類加載器的名稱的對應(yīng)關(guān)系;
30、第四獲取模塊,用于從所述依賴對應(yīng)關(guān)系中獲取調(diào)用依賴的類加載器的名稱為所述applicationclassloader類加載器且調(diào)用依賴的途徑非所述依賴分析agent包含的代碼模塊的目標(biāo)依賴;
31、確定模塊,用于確定所述java應(yīng)用對應(yīng)的所有依賴除去所述目標(biāo)依賴外的依賴為未使用依賴。
32、本技術(shù)第三方面提供一種計(jì)算機(jī)程序產(chǎn)品,包括計(jì)算機(jī)可讀指令,當(dāng)所述計(jì)算機(jī)可讀指令在服務(wù)器上運(yùn)行時(shí),使得所述服務(wù)器實(shí)現(xiàn)上述第一方面或第一方面任一實(shí)現(xiàn)方式的java應(yīng)用中未使用依賴識別方法。
33、本技術(shù)第四方面提供一種服務(wù)器,包括至少一個(gè)處理器和與所述處理器連接的存儲器,其中:
34、所述存儲器用于存儲計(jì)算機(jī)程序;
35、所述處理器用于執(zhí)行所述計(jì)算機(jī)程序,以使所述服務(wù)器能夠?qū)崿F(xiàn)上述第一方面或第一方面任一實(shí)現(xiàn)方式的java應(yīng)用中未使用依賴識別方法。
36、本技術(shù)第五方面提供一種計(jì)算機(jī)存儲介質(zhì),所述存儲介質(zhì)承載有一個(gè)或多個(gè)計(jì)算機(jī)程序,當(dāng)所述一個(gè)或多個(gè)計(jì)算機(jī)程序被服務(wù)器執(zhí)行時(shí),能夠使所述服務(wù)器上述第一方面或第一方面任一實(shí)現(xiàn)方式的java應(yīng)用中未使用依賴識別方法。
37、借由上述技術(shù)方案,本技術(shù)提供了一種java應(yīng)用中未使用依賴識別方法,跳出了相關(guān)技術(shù)中的mvn?dependency靜態(tài)分析模式,采用更精確的java?agent動(dòng)態(tài)分析模式。本技術(shù)設(shè)置加載java應(yīng)用和agent代碼模塊的類加載器為applicationclassloader類加載器;加載core代碼模塊的類加載器為profileragentclassloader類加載器;且applicationclassloader類加載器與profileragentclassloader類加載器為兄弟類加載器,從而實(shí)現(xiàn)了agent代碼模塊與java應(yīng)用的隔離。本技術(shù)中依賴分析agent引入了bridge代碼模塊。bridge代碼模塊使用依賴分析agent與java應(yīng)用均可見的父類加載器即bootstrapclassloader類加載器加載,從而實(shí)現(xiàn)了java應(yīng)用在調(diào)用agent代碼模塊的增強(qiáng)代碼時(shí),可以通過bridge代碼模塊調(diào)用core代碼模塊中的靜態(tài)增強(qiáng)處理函數(shù)的目的,從而實(shí)現(xiàn)了在java應(yīng)用運(yùn)行過程中獲取java應(yīng)用調(diào)用的依賴的目的。