本發(fā)明涉及Java 應(yīng)用開發(fā)領(lǐng)域,尤其涉及一種判斷JAR包是否被引用的方法及設(shè)備。
背景技術(shù):
JAVA是一種功能全面的面向?qū)ο缶幊陶Z言。因此,JAVA程序通過建立彼此交互作用的軟件部件的結(jié)構(gòu)化集合而產(chǎn)生期望效果。這些部件稱為對象,并且可以安排在對象類體系結(jié)構(gòu)中,對象類也簡稱為類。JAVA程序不是直接在計算機(jī)的操作系統(tǒng)上運行,而是在JAVA虛擬機(jī)JVM上運行,該JAVA虛擬機(jī)本身就是在計算機(jī)操作系統(tǒng)上運行的程序。由于JAVA的面向?qū)ο筇匦约癑VM的標(biāo)準(zhǔn)化,JAVA程序可實現(xiàn)“一次編譯,到處執(zhí)行”的跨平臺特性。
在一個應(yīng)用項目的開發(fā)過程中,通常會涉及大量的class 文件,為了便于存儲和使用,通常采用JAR 包的形式。JAR(Java Archive)包是JAVA的一種壓縮包,也可以認(rèn)為是一系列class 文件的集合,要在項目中使用某個JAR 包時,需要在用于指定類加載路徑的相關(guān)參數(shù)( 通常是classpath 參數(shù)) 中設(shè)置所述JAR 包的路徑,虛擬機(jī)就可以在運行時動態(tài)加載所述JAR 包中包含的類。
如今的大型的JAVA應(yīng)用程序,尤其是JAVA WEB程序,動輒須要引用大量的第三方JAR包,這樣雖然可能提高開發(fā)效率,但是不當(dāng)?shù)囊肑AR包,很容易引起包沖突。尤其是隨著開源框架的興起,大量框架依賴一系列的組件,但是初學(xué)者往往無法分辨哪些是核心JAR包,哪些是附加性的高級功能,于是全部下載引用,經(jīng)常會出現(xiàn)和另一個框架的某個JAR包沖突的情況。比如經(jīng)典的開發(fā)框架組合struts2 spring2 hibernate3就存在asm.jar等好幾個包沖突的情況。
此外,還有一種情況就是開發(fā)人員已經(jīng)不記得曾經(jīng)添加過某個JAR包,但是這個包是從始至終可能完全就是個多余的。多余的JAR包不僅存在應(yīng)用風(fēng)險,而且很多時候JAR包需要spring容器托管,極易導(dǎo)致內(nèi)存浪費。
現(xiàn)有技術(shù)中,通常有經(jīng)驗的開發(fā)人員是按照相應(yīng)JAR包的說明規(guī)范來應(yīng)用,即完全按照說明文檔來處理。再或者初學(xué)者更多的是完全依靠人力,把JAR包內(nèi)的所有包和類都和自己的源碼一一對比,依次嘗試刪除被懷疑的JAR,然后編譯運行,但是這樣太過費時費力,而且也容易出錯。
技術(shù)實現(xiàn)要素:
針對上述現(xiàn)有技術(shù)的缺點,本發(fā)明的目的是提供一種判斷JAR包是否被引用的方法及設(shè)備,通過對比JAVA源文件中引用的外部包和所引用的每個JAR包文件中的包,初步判斷哪些包是多余的,從而給與編碼人員刪除非必要包的建議,不僅給源碼程序瘦身,而且也規(guī)避了因為JAR包不當(dāng)引入而引起的包沖突等風(fēng)險,提高程序安全性。
本發(fā)明實施例提供的一種判斷JAR包是否被引用的方法,該方法包括:
解壓JAR包,建立每個JAR包文件和其中包含的包路徑的對應(yīng)關(guān)系;
記錄源碼所引用的所有的包和類,建立每個類文件和所引用包路徑的對應(yīng)關(guān)系;
對比JAR包文件中是否包含源碼所引用的包中的任何一個,如是,則該JAR包是必須包,否則為可疑包。
進(jìn)一步地,上述方法中,解壓JAR包之后,還包括:
建立JAR包文件中每個包路徑和其中包含的具體的類的對應(yīng)關(guān)系。
進(jìn)一步地,上述方法中,記錄源碼所引用的所有的包和類之后,還包括:
建立源碼所引用的每個包路徑和其中包含的具體的類的對應(yīng)關(guān)系。
進(jìn)一步地,上述方法中,若解壓的JAR包文件的包路徑和源碼所引用的包路徑一致,則比對JAR包文件中是否包含源碼所引用的包路徑中包含的具體的類,如是,則該JAR包是必須包,否則為可疑包。
進(jìn)一步地,上述方法中,所述源碼所引用的所有類對外部類的引用在頭部以import來引用。
本發(fā)明實施例提供的一種判斷JAR包是否被引用的設(shè)備,該設(shè)備包括:
JAR包解壓器,用于解壓JAR包,建立每個JAR包文件和其中包含的包路徑的對應(yīng)關(guān)系;
源碼閱讀器,用于記錄源碼所引用的所有的包和類,建立每個類文件和所引用包路徑的對應(yīng)關(guān)系;
比對器,用于對比JAR包文件中是否包含源碼所引用的包中的任何一個,如是,則該JAR包是必須包,否則為可疑包。
進(jìn)一步地,所述JAR包解壓器,還用于:
建立JAR包文件中每個包路徑和其中包含的具體的類的對應(yīng)關(guān)系。
進(jìn)一步地,所述源碼閱讀器,還用于:
建立源碼所引用的每個包路徑和其中包含的具體的類的對應(yīng)關(guān)系。
進(jìn)一步地,所述比對器,還用于:
若解壓的JAR包文件的包路徑和源碼所引用的包路徑一致,則比對JAR包文件中是否包含源碼所引用的包路徑中包含的具體的類,如是,則該JAR包是必須包,否則為可疑包。
進(jìn)一步地,所述源碼閱讀器中源碼所引用的所有類對外部類的引用在頭部以import來引用。
與現(xiàn)有技術(shù)相比,本發(fā)明從自身源碼中輸出所依賴的包路徑,再從JAR文件中輸出已有的包路徑,最后比對兩個路徑從而決定是否將JAR文件列為可疑包。本發(fā)明實施例通過對比JAVA源文件中引用的外部包類和所引用的JAR包中的包類,初步判斷哪些包是多余的,從而給與編碼人員刪除非必要包的建議,不僅給源碼程序瘦身,而且也規(guī)避了因為JAR包不當(dāng)引入而引起的包沖突等風(fēng)險,提高了程序的安全性。本發(fā)明比對過程自動化,替代手動,提升效率。最終結(jié)果雖然只是減少JAR包,但又可能提高性能。同時,也在一定程度上減少了JAR包沖突的可能性。
附圖說明
為了更清楚地說明本發(fā)明實施例中的技術(shù)方案,下面將對實施例描述中所需要使用的附圖作簡要介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域的普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明提供的一種判斷JAR包是否被引用的方法流程圖一;
圖2為本發(fā)明提供的一種解壓JAR包的示意圖;
圖3為本發(fā)明提供的一種源碼所引用的包和類示例圖;
圖4為本發(fā)明提供的一種判斷JAR包是否被引用的方法流程圖二;
圖5為本發(fā)明提供的一種判斷JAR包是否被引用的設(shè)備結(jié)構(gòu)示意圖。
具體實施方式
為了使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合附圖對本發(fā)明作進(jìn)一步地詳細(xì)描述,顯然,所描述的實施例僅僅是本發(fā)明一部份實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其它實施例,都屬于本發(fā)明保護(hù)的范圍。
本發(fā)明從自身源碼中輸出所依賴的包路徑,再從JAR文件中輸出已有的包路徑,最后比對兩個路徑從而決定是否將JAR文件列為可疑包。本發(fā)明實施例通過對比JAVA源文件中引用的外部包類和所引用的JAR包中的包類,初步判斷哪些包是多余的,從而給與編碼人員刪除非必要包的建議,不僅給給源碼程序瘦身,而且也規(guī)避了因為JAR包不當(dāng)引入而引起的包沖突等風(fēng)險,提高了程序的安全性。
下面結(jié)合說明書附圖對本發(fā)明實施例作進(jìn)一步詳細(xì)描述。
如圖1所示,本發(fā)明實施例公開了一種判斷JAR包是否被引用的方法,該方法包括:
步驟S101,解壓JAR包,建立每個JAR包文件和其中包含的包路徑的對應(yīng)關(guān)系;
步驟S102,記錄源碼所引用的所有的包和類,建立每個類文件和所引用包路徑的對應(yīng)關(guān)系;
步驟S103,對比JAR包文件中是否包含源碼所引用的包中的任何一個,如是,則該JAR包是必須包,否則為可疑包。
具體的,在上述步驟S101中,JAR包也是一種壓縮包,和ZIP壓縮包一樣也可以解壓。例如,JAR文件:test. Jar,使用命令:jar xf xxx. Jar,即可解開看到所有的包結(jié)構(gòu)和包中所有的類,如圖2所示。所以只需要一個JAVA運行時,運行JAR命令產(chǎn)生即可。
在上述步驟S102中,源碼是指開發(fā)者自己寫的代碼類,記錄該源碼所引用的所有的包和類。如圖3所示,源碼:package com. mike,就引用了java.io.*、java.net.*、java.util.*三個包的10來個類。
在上述步驟S103中,絕大多數(shù)實際情況下,只要從包這個級別進(jìn)行對比即可,即對比JAR包文件中是否包含源碼所引用的包中的任何一個。例如:一個JAR包文件test. Jar通過解壓器輸出后,只要包含java.io.*、java.net.*、java.util.*中任何一個,則該JAR包就是必須包,否則,如果test. Jar任何一個都不包含,則列為可疑包。
本發(fā)明實施例從自身源碼中輸出所依賴的包路徑,再從JAR文件中輸出已有的包路徑,最后比對兩個路徑從而決定是否將JAR文件列為可疑包。
與現(xiàn)有技術(shù)相比,本發(fā)明比對過程自動化,替代手動,提升效率。最終結(jié)果雖然只是減少JAR包,但又可能提高性能。同時,也在一定程度上減少了JAR包沖突的可能性。
具體實施中,本發(fā)明實施例可將上述步驟S102置于步驟S101之前,即本發(fā)明并不對上述步驟S101和步驟S102的先后順序予以限定。
可選的,如圖4所示,本發(fā)明實施例公開了一種判斷JAR包是否被引用的方法,該方法包括:
步驟S401,記錄源碼所引用的所有的包和類,建立每個類文件和所引用包路徑的對應(yīng)關(guān)系;
步驟S402,解壓JAR包,建立每個JAR包文件和其中包含的包路徑的對應(yīng)關(guān)系;
步驟S403,對比JAR包文件中是否包含源碼所引用的包中的任何一個,如是,則該JAR包是必須包,否則為可疑包。
本發(fā)明實施例通過對比JAVA源文件中引用的外部包類和所引用的JAR包中的包類,初步判斷哪些包是多余的,從而給予編碼人員刪除非必要包的建議,不僅給源碼程序瘦身,而且也規(guī)避了因為JAR包不當(dāng)引入而引起的包沖突等風(fēng)險,提高了程序的安全性。
進(jìn)一步地,上述方法中,解壓JAR包之后,還包括:
建立JAR包文件中每個包路徑和其中包含的具體的類的對應(yīng)關(guān)系。
本發(fā)明實施例,解壓JAR包之后,可以有以下兩項輸出:
(一)建立每個JAR包文件和其中包含的包路徑的對應(yīng)關(guān)系;
(二)建立JAR包文件中每個包路徑和其中包含的具體的類的對應(yīng)關(guān)系。
進(jìn)一步地,上述方法中,記錄源碼所引用的所有的包和類之后,還包括:
建立源碼所引用的每個包路徑和其中包含的具體的類的對應(yīng)關(guān)系。
本發(fā)明實施例,記錄源碼所引用的所有的包和類之后,可以有以下兩項輸出:
(一)建立每個類文件和所引用包路徑的對應(yīng)關(guān)系;
(二)建立源碼所引用的每個包路徑和其中包含的具體的類的對應(yīng)關(guān)系;
進(jìn)一步地,上述方法中,若解壓的JAR包文件的包路徑和源碼所引用的包路徑一致,則比對JAR包文件中是否包含源碼所引用的包路徑中包含的具體的類,如是,則該JAR包是必須包,否則為可疑包。
實施中,本發(fā)明實施例,如果發(fā)現(xiàn)有兩個JAR文件有一樣的包路徑(這種情況較少出現(xiàn)),就須要從類這個級別進(jìn)行對比,即比對JAR包文件中是否包含源碼所引用的包路徑中包含的具體的類。如圖2和 3所示,例如:test1.jar和test2.jar通過解壓輸出后,都包含java.net.*包,那么,test1.jar和test2.jar應(yīng)該列為待定。繼續(xù)啟動類級別比對,其中,test1.jar和test2.jar哪個包含java.net.URI和java.net.HttpURLConnection,則為必須包,另一個則為可疑包。
進(jìn)一步地,上述方法中,所述源碼所引用的所有類對外部類的引用在頭部以import來引用。
本發(fā)明實施例,按照J(rèn)AVA編碼規(guī)范,所有類對外部類的引用通通在頭部以import來引用,所以,只要讀取頭部以import開頭的所有行即可。
需要注意的是,本發(fā)明實施例僅輸出一個可能不被引用的建議,并非是一個確定的值。有些時候JAR包未必是在類中引用,有可能是在運行后加載;也可能是在配置文件中由容器(例如spring框架的容器)引用的,這兩點都不能漏掉;此外,所引用的JAR包雖然不被自身開發(fā)的源碼直接引用,但是有可能它們自身之間有循環(huán)引用。所以,不可貿(mào)然刪除操作,需要反復(fù)測試。
基于相同的技術(shù)構(gòu)思,本發(fā)明實施例還提供一種判斷JAR包是否被引用的設(shè)備,該設(shè)備可執(zhí)行上述方法實施例,由于該設(shè)備解決問題的原理與前述一種判斷JAR包是否被引用的方法相似,因此該設(shè)備的實施可以參見方法的實施。
如圖5所示,本發(fā)明實施例提供的一種判斷JAR包是否被引用的設(shè)備,該設(shè)備包括:
JAR包解壓器501,用于解壓JAR包,建立每個JAR包文件和其中包含的包路徑的對應(yīng)關(guān)系;
源碼閱讀器502,用于記錄源碼所引用的所有的包和類,建立每個類文件和所引用包路徑的對應(yīng)關(guān)系;
比對器503,用于對比JAR包文件中是否包含源碼所引用的包中的任何一個,如是,則該JAR包是必須包,否則為可疑包。
具體的,JAR包也是一種壓縮包,和ZIP壓縮包一樣也可以解壓。例如,JAR文件:test. Jar,使用命令:jar xf xxx. Jar,即可解開看到所有的包結(jié)構(gòu)和包中所有的類。所以只需要一個JAVA運行時,運行JAR命令產(chǎn)生即可。
源碼是指開發(fā)者自己寫的代碼類,源碼閱讀器502是一個簡單的記錄器,記錄了該源碼所引用的所有的包和類。例如,源碼:package com. mike,引用了java.io.*、java.net.*、java.util.*三個包的10來個類。
在絕大多數(shù)實際情況下,比對器503只要從包這個級別進(jìn)行對比即可,即對比JAR包文件中是否包含源碼所引用的包中的任何一個。例如:一個JAR包文件test. Jar通過解壓器輸出后,只要包含java.io.*、java.net.*、java.util.*中任何一個,則該JAR包就是必須包,否則,如果test. Jar任何一個都不包含,則列為可疑包。
本發(fā)明實施例從自身源碼中輸出所依賴的包路徑,再從JAR文件中輸出已有的包路徑,最后比對兩個路徑從而決定是否將JAR文件列為可疑包。
與現(xiàn)有技術(shù)相比,本發(fā)明比對過程自動化,替代手動,提升效率。最終結(jié)果雖然只是減少JAR包,但又可能提高性能。同時,也在一定程度上減少了JAR包沖突的可能性。
進(jìn)一步地,所述JAR包解壓器501,還用于:
建立JAR包文件中每個包路徑和其中包含的具體的類的對應(yīng)關(guān)系。
本發(fā)明實施例,所述JAR包解壓器501,用于:
(一)建立每個JAR包文件和其中包含的包路徑的對應(yīng)關(guān)系;
(二)建立JAR包文件中每個包路徑和其中包含的具體的類的對應(yīng)關(guān)系。
進(jìn)一步地,所述源碼閱讀器502,還用于:
建立源碼所引用的每個包路徑和其中包含的具體的類的對應(yīng)關(guān)系。
本發(fā)明實施例,所述源碼閱讀器502,用于:
(一)建立每個類文件和所引用包路徑的對應(yīng)關(guān)系;
(二)建立源碼所引用的每個包路徑和其中包含的具體的類的對應(yīng)關(guān)系;
進(jìn)一步地,所述比對器503,還用于:
若解壓的JAR包文件的包路徑和源碼所引用的包路徑一致,則比對JAR包文件中是否包含源碼所引用的包路徑中包含的具體的類,如是,則該JAR包是必須包,否則為可疑包。
實施中,本發(fā)明實施例,如果發(fā)現(xiàn)有兩個JAR文件有一樣的包路徑(這種情況較少出現(xiàn)),所述比對器就須要從類這個級別進(jìn)行對比,即比對JAR包文件中是否包含源碼所引用的包路徑中包含的具體的類。例如:test1.jar和test2.jar通過解壓輸出后,都包含java.net.*包,那么,test1.jar和test2.jar應(yīng)該列為待定。繼續(xù)啟動類級別比對,其中,test1.jar和test2.jar哪個包含java.net.URI和java.net.HttpURLConnection,則為必須包,另一個則為可疑包。
進(jìn)一步地,所述源碼閱讀器502中源碼所引用的所有類對外部類的引用在頭部以import來引用。
本發(fā)明實施例,按照J(rèn)AVA編碼規(guī)范,所有類對外部類的引用通通在頭部以import來引用,所以,源碼閱讀器只要讀取頭部以import開頭的所有行即可。
綜上,本發(fā)明從自身源碼中輸出所依賴的包路徑,再從JAR文件中輸出已有的包路徑,最后比對兩個路徑從而決定是否將JAR文件列為可疑包。本發(fā)明實施例通過對比JAVA源文件中引用的外部包類和所引用的JAR包中的包類,初步判斷哪些包是多余的,從而給與編碼人員刪除非必要包的建議,不僅給給源碼程序瘦身,而且也規(guī)避了因為JAR包不當(dāng)引入而引起的包沖突等風(fēng)險,提高了程序的安全性。本發(fā)明比對過程自動化,替代手動,提升效率。最終結(jié)果雖然只是減少JAR包,但又可能提高性能。同時,也在一定程度上減少了JAR包沖突的可能性。
盡管已描述了本發(fā)明的優(yōu)選實施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對這些實施例做出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實施例以及落入本發(fā)明范圍的所有變更和修改。
顯然,本領(lǐng)域的技術(shù)人員可以對本發(fā)明進(jìn)行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。