專利名稱:模塊化java應用軟件在線更新系統(tǒng)及方法
技術領域:
本發(fā)明涉及一種模塊化JAVA應用軟件在線更新系統(tǒng)及方法。
背景技術:
隨著信息化社會的不斷發(fā)展,一個軟件系統(tǒng)隨需求的變化不斷地更新已變得非常 普遍,由此,軟件更新對于一個軟件系統(tǒng)來說也變得至關重要,只有持續(xù)不斷的進行軟件的 更新才能適應用戶不斷變化的用戶需求。為了適應軟件的易更新性,優(yōu)秀的設計模式不斷被投入到軟件設計中,對軟件更 新在設計時提供了巨大的支持,新的技術及體系架構也不斷涌現以實現軟件更新的易用 性,例如面向方面編程及面向服務的體系結構,這些設計模式、技術以及體系結構都能實現 代碼的獨立性和易擴展性,以達到軟件易更新和易擴展的目的,但是這些技術只是解決了 開發(fā)階段的軟件更新,卻未能解決系統(tǒng)運行時進行軟件動態(tài)更新的問題。目前,對于一個已經上線的軟件系統(tǒng),如果對其進行更新必須停止服務器的運行, 并對更新后的軟件系統(tǒng)重新編譯發(fā)布并進行部署,這必然會導致軟件系統(tǒng)的服務在一定時 間內處于停滯狀態(tài),從而會影響到用戶的使用,對于擁有大量用戶的業(yè)務系統(tǒng)來說,如空中 交通管制系統(tǒng)、全球性的金融交易系統(tǒng)、工業(yè)控制系統(tǒng)、網絡服務系統(tǒng)等,通過停止、更新和 重啟來實現維護和更新將導致不可接受的延遲、代價和危險,并造成大量的經濟損失。
發(fā)明內容
有鑒于此,本發(fā)明的主要目的在于提供一種模塊化JAVA應用軟件在線更新系統(tǒng) 及方法,能在不停止系統(tǒng)業(yè)務的情況下實現新增或更新業(yè)務的加載,業(yè)務加載后不必重啟 業(yè)務系統(tǒng)。為達到上述目的,本發(fā)明的技術方案是這樣實現的—種模塊化JAVA應用軟件在線更新系統(tǒng),包括有軟件資源信息挖掘子系統(tǒng)和軟 件動態(tài)更新子系統(tǒng),其中,所述軟件資源信息挖掘子系統(tǒng)包括有系統(tǒng)文件監(jiān)視器、源代碼加 載分析器、系統(tǒng)類分析器、類依賴關系產生器、樹或有向圖依賴關系產生器和模塊劃分產生 器;其中所述系統(tǒng)文件監(jiān)視器用于配置客戶軟件系統(tǒng)的監(jiān)控目錄并提取出所述監(jiān)控目錄 中的文件信息;所述源代碼加載分析器用于將所述客戶軟件系統(tǒng)中獲取的源代碼文件以文件為 單位以字符流的方式加載到內存;所述系統(tǒng)類分析器用于從所述客戶軟件系統(tǒng)中獲取文件信息及源代碼中提取出 所述客戶軟件系統(tǒng)中所有的類及類本身的信息,并將所述類本身的信息依次注冊到接口描 述文件中;所述類依賴關系產生器用于讀取所述系統(tǒng)類分析器產生的類信息,并結合所述類 本身的信息在所述源代碼加載分析器中進行逆向分析,產生每個類對其它類的依賴關系,
5并將產生的關系依次注冊到所述接口描述文件中;所述樹或有向圖依賴關系產生器用于讀取所述類依賴關系產生器中產生的類的 依賴關系,并結合所述類本身的信息產生相應的依賴關系樹結構或有向圖,以供所述軟件 動態(tài)更新子系統(tǒng)進行分析讀取,以在更新過程中確定類的加載順序;所述模塊劃分產生器用于對所述客戶軟件系統(tǒng)以依賴關系為單位進行模塊劃分, 并產生模塊結構,將所述模塊結構提供給所述軟件動態(tài)更新子系統(tǒng),所述軟件動態(tài)更新子 系統(tǒng)在更新時按照所劃分的模塊分別按階段獨立更新;所述軟件動態(tài)更新子系統(tǒng)包括有接口、總代理單元、模塊代理單元及管理平臺;其 中所述總代理單元用于在接收到用戶輸入的待加載的類的參數后生成所述類的實 例對象或應用程序的調用結果;所述模塊代理單元用于利用用戶輸入的類的參數對管理模塊內所有類的加載、對 象的實例化和類的更新;管理平臺用于管理所述客戶軟件系統(tǒng),并為所述軟件動態(tài)更新子系統(tǒng)提供必要的 工具支持,主要包括創(chuàng)建動態(tài)配置文件及其讀取和寫入、類依賴關系的解析、模塊依賴關系 的解析、文件及目錄的復制工具;所述接口包括內部接口和外部接口,所述內部接口為所述軟件資源挖掘子系統(tǒng)與 所述軟件動態(tài)更新子系統(tǒng)之間的接口 ;所述外部接口用于向開發(fā)人員提供編程接口及類的 參數輸入接口。其中,所述總代理單元包括工廠模塊,用于負責創(chuàng)建和維護所述模塊代理單元處理的實例,即維護模塊名到 實例的映射,并將所述總代理單元的請求進行參數處理,調用對應的模塊代理單元進行處 理;在當前請求為獲取對象請求時,在將實例對象返回給所述總代理單元之前觸發(fā)時間戳 模塊,通過對所述代理實例對象設定時間戳后再返回給所述總代理單元;時間戳模塊,用于在應用軟件更新時,記錄下所有更新類的更新時刻,接收到應用 系統(tǒng)對所述應用軟件的調用請求時,首先將參數中的時間與所設置的更新時間戳進行對 比,若早于更新時間則返回調用舊類的結果,否則返回調用更新后的類的結果;在應用請求 為獲取對象請求時,在實例對象返回給應用請求之前設定其生成時間,即將實例對象的屬 性字段設定為當前的時間;注冊中心,用于記錄當前所有的模塊及每個模塊涉及的具體的類、確定所述類是 否注冊及其所屬的模塊。其中,所述模塊代理單元包括對象管理器,用于根據索取的對象實例的具體請求來返回不同的實例對象;即通 過調用類加載器索取類的類型對象,并通過反射方式返回實例化對象;類加載器,用于根據請求將指定的類文件加載至內存,同時返回對應類的類型對 象的引用;通過調用模塊描述器讀取當前請求類的更新時間,之后與參數中的時間進行對 比,若所述參數的時間早于時間戳的時間則返回舊的類的類型實例對象,否則返回新的類 的類型實例對象;模塊描述器,用于描述模塊內所有類文件的信息,包括類名、類名所對應的路徑、有無更新、對應更新后類的信息、更新的時間點。其中,所述類依賴關系產生器先使用正則表達式將源文件中的所有非編譯部分的 注釋全部去除,然后通過總結一個類在JAVA源代碼中被調用的方式,使用正則表達式與類 名進行組合,然后再在全文件中進行搜索匹配,保證依賴關系生成的正確性。其中,所述模塊劃分產生器在模塊劃分的過程中對每個模塊設立標志位,對于縱 向劃分過程中使用切割生成的模塊,對于其他模塊有依賴關系進行標志,并對模塊下的起 始類設置上層關聯(lián)類存儲字段以存儲在切割之前的上層類,通過該上層類所在的模塊而確 定模塊之間的依賴關系。一種模塊化JAVA應用軟件在線更新方法,包括監(jiān)視客戶軟件系統(tǒng)輸入的掃描路徑,提取并分析掃描路徑下的文件目錄,以文件 為單位以字符流的方式加載到內存;對系統(tǒng)文件監(jiān)視器中生成的文件目錄進行分析,提取 客戶軟件系統(tǒng)中所有的類及類信息,并將類信息注冊到所設置的中間文件中;讀取所述類 信息,并在所加載的源代碼信息中進行逆向分析,產生每個類對于其他類的依賴關系,并將 產生的依賴關系依次注冊到所述中間文件中;根據類之間的依賴關系,結合類信息生成依 賴關系樹結構或有向圖結構,并對依賴關系樹結構或有向圖結構進行分割,生成模塊結構, 同時生成包含有模塊劃分和模塊內部所有類關系的類配置文件和模塊間依賴關系的模塊 配置文件;并將兩配置文件部署到服務器上,同時配置啟動所需的文件;讀取類配置文件 和模塊配置文件,將從上述類配置文件和模塊配置文件中讀取的類和模塊信息注冊到注冊 中心新生成的新配置文件中,并生成模塊代理和對應模塊的描述文件;接收到更新類的選擇輸入后,根據更新前類名提取出新類所在位置,將新類拷貝 到對應的文件目錄中;接收新增掃描指令后,監(jiān)視所輸入的掃描路徑,提取并分析掃描路徑下的新增模 塊源代碼文件目錄列表,以文件為單位以字符流的方式加載到內存,并對系統(tǒng)文件監(jiān)視器 中產生的文件目錄進行分析,提取客戶軟件系統(tǒng)中所有的新增類及類信息,讀取所述類信 息,在加載的新增源代碼信息中進行逆向分析,生成每個新增類對于其他類的依賴關系,并 將生成的依賴關系依次注冊到新增類模塊配置文件中,同時生成新增模塊間的依賴關系, 注冊到新增配置文件中;根據新增類配置文件及新增模塊配置文件,對新增模塊解壓縮,并 將解壓后的類拷貝入目標位置,該位置由新增模塊的內部文件結構指定;讀入所述模塊配 置文件,對其進行修剪并將修剪后的信息加入所述類配置文件中,讀入新增模塊配置文件, 對其進行修剪并將修剪后的信息加入所述模塊配置文件中;將新增的類和模塊信息注冊到 注冊中心,即加入到所述新配置文件中,并生成新增模塊的模塊代理和對應模塊的描述文 件,執(zhí)行所述掃描文件。本發(fā)明首先獲取客戶軟件系統(tǒng)中所有的類,確定所有類之間的關系,將這些類劃 分為不同的模塊,并對當前的客戶軟件系統(tǒng)中的類文件進行監(jiān)控,確定有新的類文件導入 時,確定該新導入的類文件與當前類文件之間的關系,確定出執(zhí)行該新導入的類文件的配 置文件,并將所確定的新導入類文件的配置文件加載到客戶軟件系統(tǒng)中的內存中,在接收 到客戶的調用請求時執(zhí)行該新導入的類文件。這樣,無論導入多少業(yè)務文件,只要該類文件 的編譯沒有問題,均可直接獲得執(zhí)行,從而不必重新啟動業(yè)務系統(tǒng)即可實現業(yè)務的加載。本 發(fā)明在不重啟系統(tǒng)的情況下實現了業(yè)務的加載。
圖1為本發(fā)明模塊化JAVA應用軟件在線更新系統(tǒng)的結構示意圖;圖2為本發(fā)明總代理單元的結構示意圖;圖3為本發(fā)明模塊代理單元的結構示意圖;圖4為本發(fā)明客戶軟件系統(tǒng)部署前及新增前的處理流程圖;圖5為本發(fā)明客戶軟件系統(tǒng)運行時的流程圖。
具體實施例方式以下結合附圖對本發(fā)明作進一步詳細描述。圖1為本發(fā)明模塊化JAVA應用軟件在線更新系統(tǒng)的結構示意圖,如圖1所示,本 發(fā)明模塊化JAVA應用軟件在線更新系統(tǒng)包括有軟件資源信息挖掘子系統(tǒng)10和軟件動態(tài)更 新子系統(tǒng)11,其中,軟件資源信息挖掘子系統(tǒng)10包括有系統(tǒng)文件監(jiān)視器101、源代碼加載分 析器103、系統(tǒng)類分析器102、類依賴關系產生器104、樹或有向圖依賴關系產生器105和模 塊劃分產生器106;其中,系統(tǒng)文件監(jiān)視器101用于配置客戶軟件系統(tǒng)的監(jiān)控目錄并提取出 所述監(jiān)控目錄中的文件信息;源代碼加載分析器103用于將所述客戶軟件系統(tǒng)中獲取的源 代碼文件以文件為單位以字符流的方式加載到內存;系統(tǒng)類分析器102用于從所述客戶軟 件系統(tǒng)中獲取文件信息及源代碼中提取出所述客戶軟件系統(tǒng)中所有的類及類本身的信息, 并將所述類本身的信息依次注冊到接口描述文件中;類依賴關系產生器104用于讀取系統(tǒng) 類分析器102產生的類信息,并結合所述類本身的信息在所述源代碼加載分析器中進行逆 向分析,產生每個類對其它類的依賴關系,并將產生的關系依次注冊到所述接口描述文件 中;樹或有向圖依賴關系產生器105用于讀取類依賴關系產生器104中產生的類的依賴關 系,并結合所述類本身的信息產生相應的依賴關系樹結構或有向圖,以供所述軟件動態(tài)更 新子系統(tǒng)進行分析讀取,以在更新過程中確定類的加載順序;模塊劃分產生器106用于對 所述客戶軟件系統(tǒng)以依賴關系為單位進行模塊劃分,并產生模塊結構,將所述模塊結構提 供給軟件動態(tài)更新子系統(tǒng)11,軟件動態(tài)更新子系統(tǒng)11在更新時按照所劃分的模塊分別按 階段獨立更新;軟件動態(tài)更新子系統(tǒng)11包括有接口 111、總代理單元112、模塊代理單元 113及管理平臺114 ;其中,總代理單元112用于在接收到用戶輸入的待加載的類的參數后 生成所述類的實例對象或應用程序的調用結果;模塊代理單元113用于利用用戶輸入的類 的參數對管理模塊內所有類的加載、對象的實例化和類的更新;管理平臺114用于管理所 述客戶軟件系統(tǒng),并為軟件動態(tài)更新子系統(tǒng)提供必要的工具支持,主要包括創(chuàng)建動態(tài)配置 文件及其讀取和寫入、類依賴關系的解析、模塊依賴關系的解析、文件及目錄的復制工具; 接口 111包括內部接口和外部接口,所述內部接口為所述軟件資源挖掘子系統(tǒng)與所述軟件 動態(tài)更新子系統(tǒng)之間的接口 ;所述外部接口用于向開發(fā)人員提供編程接口及類的參數輸入 接口。其中,類依賴關系產生器104先使用正則表達式將源文件中的所有非編譯部分的 注釋全部去除,然后通過總結一個類在JAVA源代碼中被調用的方式,使用正則表達式與類 名進行組合,然后再在全文件中進行搜索匹配,保證依賴關系生成的正確性。模塊劃分產生器106在模塊劃分的過程中對每個模塊設立標志位,對于縱向劃分過程中使用切割生成的模塊,對于其他模塊有依賴關系進行標志,并對模塊下的起始類設 置上層關聯(lián)類存儲字段以存儲在切割之前的上層類,通過該上層類所在的模塊而確定模塊 之間的依賴關系。具體的,軟件資源挖掘子系統(tǒng)總體包括四個包結構,分別為com. evolution, struct 包、com. evolution, mining 包、com. evolution, modular 包禾口 com. evolution, run 包,其中,com. evolution, struct包負責客戶軟件系統(tǒng)中所有類的信息以及模塊的信息的 存儲,是系統(tǒng)的公共訪問區(qū),屬于所有系統(tǒng)模塊的共享資源,用于存儲各個模塊產生的類及 模塊信息以及供各個模塊對類及模塊信息的讀取。com. evolution, struct包中包含有三 個類Classhf、AllInfor和Module,其中,ClassInf類用于存儲每個類的內部信息,包括 類名,類的完全限定名,類所在文件的存儲路徑,類是否入度大于1的標記,類的入度,類所 屬模塊,依賴于該類的類列表,以及該類所依賴的類列表。同時,為了保證該類的封裝性以 及類信息的可存儲性,該類為每個類的信息屬性提供了相應的set及get方法進行存取。 Module類用于存儲每個模塊的內部信息,包括模塊名,模塊是否依賴于其他模塊的標記,模 塊所依賴的模塊列表,以及模塊中所存在的類列表。同時,為了保證該類的封裝性以及模 塊信息的可存儲性,該類為每個模塊的信息屬性提供了相應的set及get方法進行存取。 AllInfor類用于存儲系統(tǒng)中所有的類信息及模塊信息,且所有的類信息及模塊信息能夠被 系統(tǒng)中所有的類所共享,故將其所有的類信息屬性及模塊信息屬性設為靜態(tài)屬性,同時為 其提供相應的靜態(tài)set方法及靜態(tài)get方法對其進行存取。com. evolution, mining包集成了系統(tǒng)文件監(jiān)視器,源代碼加載分析器,系統(tǒng)類分 析器,單個類的依賴關系產生器,樹及有向圖依賴關系產生器五個主要功能模塊,分別用于 監(jiān)視用戶接口文件及系統(tǒng)中的源代碼文件,將系統(tǒng)中的源代碼文件內容載入內存,通過分 析系統(tǒng)源代碼獲取系統(tǒng)中所有類的信息并進行類信息的存儲,通過分析源代碼產生類之間 的依賴關系并進行類之間依賴關系信息的存儲,通過讀取類信息產生依賴關系的樹結構 及有向圖結構并分別以relations, xml及struct, xml接口文件的形式進行體現。com. evolution, mining 包中包含有三個類Fil沾can、Convert 和 DealXml,其中,Fil沾can 類 集成了系統(tǒng)文件監(jiān)視器、源代碼加載分析器、系統(tǒng)類分析器三個模塊的功能。該類主要用于 監(jiān)視系統(tǒng)配置文件,獲取系統(tǒng)的配置目錄,并對系統(tǒng)目錄下的所有文件進行掃描,提取出符 合要求的程序源文件,并將源文件加入到內存中進行自動分析,提取出系統(tǒng)中的所有類及 根據源代碼特征獲取各個類之間的依賴關系,并將所有類的信息及類的依賴關系信息寫入 AllInf0r類中的相應成員變量中供其它模塊進行訪問。該類中各個方法的功能如下getFilesO 該方法用于監(jiān)視用戶接口文件monitor, properties文件中的內容 并獲取相應的路徑,并調用scanFiles方法,指導整個classes, xml文件的生成,并將所獲 取的類信息存儲到AllInf0r類中。scanFilesO 該方法實現了源代碼加載分析器的功能,用于通過加載系統(tǒng)源代碼 獲取系統(tǒng)中的類的信息。createXml ()該方法用于生成classes, xml文件的初始化工作。writeToXml ()該方法用于將系統(tǒng)中類的信息寫入classes, xml文件中。finishXml ()該方法用于關閉寫入classes, xml文件的輸出流。DealXml類實現了系統(tǒng)中樹或有向圖依賴關系產生器模塊中的依賴關系有向圖結構產生功能。該類通過從AllInf0r類中提取出所有的類信息及類之間的依賴關系信息,以 有向圖的結構形式進行體現,并以xml文件的形式進行描述,即自動生成系統(tǒng)的內部接口 struct, xml文件。該類中各個方法的功能如下createXml ()該方法用于生成struct, xml文件的初始化工作。checkAndffriteO 該方法用于通過分析系統(tǒng)源代碼,提取出各個類之間的依賴關 系,并將獲取到的依賴關系存儲到Allinfor類中,并將系統(tǒng)中類之間的依賴關系信息寫入 struct, xml 文件中。finishXml ()該方法用于關閉寫入struct, xml文件的輸出流。Convert類實現了系統(tǒng)中樹或有向圖依賴關系產生器模塊中的依賴關系樹結構 產生功能。該類通過從AllInf0r類中提取出所有的類信息及類之間的依賴關系信息, 以樹的結構形式進行體現,并以xml文件的形式進行描述,即自動生成系統(tǒng)的內部接口 relations, xml文件。該類中各個方法的功能如下createXml ()該方法用于生成relations, xml文件的初始化工作。convert ()該方法用于從Al 1 Infor類中獲取類之間的依賴關系信息,并調用 createTreeO方法,完成整個生成relations, xml文件的工作。createTreeO 該方法采用遞歸的方式創(chuàng)建類之間依賴關系的樹結構finishXml ()該方法用于關閉寫入relations, xml文件的輸出流。com. evolution, modular包包含了模塊劃分產生器的功能,主要根據系統(tǒng)中類之 間的依賴關系對系統(tǒng)中的類進行模塊劃分,生成模塊間的依賴關系,并將模塊信息及模塊 之間的依賴關系信息進行存儲,最終生成module, xml接口文件及ModuleRelations. xml接 口文件。com. evolution, modular 包中包含有兩個類ModuleRefs禾ΠModula,其中,Modular 類實現了系統(tǒng)中模塊劃分產生器中的模塊劃分功能。該類利用橫向切片及縱向切片相結 合的方式對系統(tǒng)中所有的類進行模塊劃分,橫向切片即依賴關系的有向圖結構中各個不相 關的有向圖進行切片劃分,縱向切片即對于單獨的一個有向圖中,將入度大于一的節(jié)點進 行入度的切割,將其及其節(jié)點下的圖單獨劃分一個模塊并以此遞歸。采用橫向切片及縱向 切片的結合的方法進行模塊劃分算法可以較好的避免模塊粒度過于龐大的問題和和粒度 太小而導致模塊數量過多的問題。該類將最終劃分出的模塊信息及模塊內類的信息存入 AllInf0r類中的相應成員變量中供其它模塊進行訪問。該類中各個方法的功能如下createXml ()該方法用于生成module, xml文件的初始化工作。divideModulesO 該方法應用橫向切片及縱向切片結合的算法將系統(tǒng)中的類進 行模塊劃分,并將模塊信息寫入到Allinfor類中。addClassesO 該方法被divideModules ()所調用,用于將各棵獨立的樹遞歸的 進行遍歷并將遍歷所得的類添加到其所對應的模塊中,并將信息存儲到Allinfor類中。generateModuleXml ()該方法通過從Allinfor類中獲取所有的模塊信息生成完 整的module, xml文件。finishXml ()該方法用于關閉寫入module, xml文件的輸出流。ModuleRefs類實現了系統(tǒng)中模塊劃分產生器中的模塊依賴關系產生功能。該類從 AllInfor類中獲取相應的模塊信息,從各模塊中存在的類與其它模塊中存在的類之間的依 賴關系中自動進行分析獲取出摸塊之間的依賴關系,并以樹的結構形式進行體現,并以ml
10文件的方式進行描述,即自動生成系統(tǒng)的內部接口 ModuleRelations. xml文件。該類中各 個方法的功能如下createXml ()該方法用于生成ModuleRelations. xml文件的初始化工作。generateRelations ()該方法通過讀取Allinfor類中的模塊信息及類信息生成 模塊之間的依賴關系,并將模塊間的依賴關系信息寫回到Al 1 infor類中。createTree ():該方法采用遞歸的方式創(chuàng)建模塊之間依賴關系的樹結構generateXml ()該方法通過從Allinfor類中獲取所有的模塊信息及模塊間的依 賴關系信息生成完整的ModuleRelations. xml文件。finishXml ()該方法用于關閉寫入ModuleRelations. xml文件的輸出流。圖2為本發(fā)明總代理單元的結構示意圖,如圖2所示,本發(fā)明總代理單元112包括 工廠模塊1120、時間戳模塊1121和注冊中心1122,其中,工廠模塊1120用于負責創(chuàng)建和維 護模塊代理單元113所處理的實例,即維護模塊名到實例的映射,并將總代理單元112的請 求進行參數處理,調用對應的模塊代理單元113進行處理;在當前請求為獲取對象請求時, 在將實例對象返回給總代理單元112之前觸發(fā)時間戳模塊,通過對所述代理實例對象設定 時間戳后再返回給總代理單元112 ;時間戳模塊1121用于在應用軟件更新時,記錄下所有 更新類的更新時刻,接收到應用系統(tǒng)對所述應用軟件的調用請求時,首先將參數中的時間 與所設置的更新時間戳進行對比,若早于更新時間則返回調用舊類的結果,否則返回調用 更新后的類的結果;在應用請求為獲取對象請求時,在實例對象返回給應用請求之前設定 其生成時間,即將實例對象的屬性字段設定為當前的時間;注冊中心1122用于記錄當前所 有的模塊及每個模塊涉及的具體的類、確定所述類是否注冊及其所屬的模塊。圖3為本發(fā)明模塊代理單元的結構示意圖,如圖3所示,本發(fā)明模塊代理單元113 包括對象管理器1130、類加載器1131和模塊描述器1132,其中,對象管理器1130用于根 據索取的對象實例的具體請求來返回不同的實例對象;即通過調用類加載器索取類的類型 對象,并通過反射方式返回實例化對象;類加載器1131用于根據請求將指定的類文件加載 至內存,同時返回對應類的類型對象的引用;通過調用模塊描述器讀取當前請求類的更新 時間,之后與參數中的時間進行對比,若所述參數的時間早于時間戳的時間則返回舊的類 的類型實例對象,否則返回新的類的類型實例對象;模塊描述器1132用于描述模塊內所有 類文件的信息,包括類名、類名所對應的路徑、有無更新、對應更新后類的信息、更新的時間 點ο軟件動態(tài)更新子系統(tǒng)主要包括三個軟件包com. evolution, proxy包、com. evolution, subproxy 包禾口 com. evolution, tools 包,其中,com. evolution, proxy 包中主 要包括總代理單元的相關實現,包括總代理類、工廠類、時間戳類和注冊中心類的實現???代理類是對用戶開放的統(tǒng)一的訪問接口,開發(fā)人員只需傳入簡單的參數就能獲得對應的 正確的實例對象或者方法調用結果,至于到底是怎樣調用和返回的,返回的是哪一個類型 對程序員是透明的。該接口包括對象獲取接口和靜態(tài)方法調用等接口。對于每個應用系 統(tǒng)只有一個總代理為用戶服務,每個總代理邏輯上由一個工廠模塊、一個時間戳模塊和 一個注冊中心三部分組成。com. evolution, proxy包中具體包括:proxy類、Factory類、 Register類和TimeMamp類,其中,proxy類包括Proxy ()私有構造方法,不允許外部 類實例化該類的對象。ge nstance (String className, Date date)根據類名和時間獲取類的實例對象,將實例對象以泛型的形式返回。ge nstance(StringclassName,Date date, Object. . . object)根據類名、時間和構造函數的參數對象列表來獲取類的實例對 象,將實例對象以泛型的形式返回。staticCalKDatedate, String className, String methodName, Object. . . args)靜態(tài)方法調用接口。根據類名、方法名和參數對象列表來取 得方法調用結果,結果以泛型的形式返回。Factory類包括SuWroXyS 所有模塊的模塊名到對應模塊代理對象實例的映射 集合。FactoryO 私有構造方法,不允許外部類實例化該類的對象。gethstance (String className, Date date)根據類名和時間獲取類的實例對象,將實例對象以泛型的形 式返回。該方法對參數進行相應的處理之后再調用模塊代理的相關方法來實現,并且 對返回的對象設置相應的時間屬性。getlnstance (String className, Date date, Object. . . object)根據類名、時間和構造函數的參數對象列表來獲取類的實例對象,將實 例對象以泛型的形式返回。該方法對參數進行相應的處理之后再調用模塊代理的相關方法 來實現,并且對返回的對象設置相應的時間屬性。getClasshstance (String className, Date date)根據類名和時間獲取類的Class類型對象。createAlISubproxy ()創(chuàng) 建所有模塊代理代理實例對象。建立模塊代理到模塊代理實例的映射關系賦值給屬 性subProxys。getSubProxy(String moduleName)根據模塊名獲得子代理實例對象。 createSubXml (String moduleName)根據模塊名創(chuàng)建模塊描述文件。Registere類包括moduleAndClass 模塊名到其對應的類名列表的映射集合。 path:軟件信息挖掘子模塊的模塊劃分結果的路徑。RegisterO 私有構造方法,不允 許外部類實例化該類的對象。register (String fileName):讀取參數給定的文件名,將 其中的信息注冊至 IJ 注冊中 A、 register (String oldClassName, String moduleName) 將該類注冊到該模塊下。getModuleNamesO 返回存有所有模塊名的字符串數組。 belong (String className)根據類名推出其屬于哪個模塊。如果不屬于任何模塊返回 null。getModuleNumO 返回模塊總數。TimeStamp類包括=TimeStampO 私有構造方法,不允許外部類實例化該類的對 象。setTim必tamp (Object ο, Date date):設定對象的產生時刻,即把參數的時間反射賦值 給該對象的時間屬性。removeAllTimeStamp ()刪除所有更新時刻信息。setUpdate (String οIdName, String newName, Date date):設定一個類的更新信息,將舊類名、新類名和更新 時間信息寫入所屬模塊的更新配置文件。com. evolution, subproxy包主要包括模塊代理類、對象管理器類、類加載器類和 模塊描述器類的實現。每個模塊代理實例由后三部分的實例組成。com. evolution, subproxy 包包含白勺類具體包括 SubProxy 類、ObjectManager 類、ClassManager 類、ModuleDes 類,其 SubProxy 類包括objectManager 該模塊代 理實例所包含的唯一對象管理器。classManager 該模塊代理實例所包含的唯一類管 理器。moduleDes 該模塊代理實例所包含的唯一模塊描述器。name 該模塊代理實例 的唯一模塊名。SubProxy(String moduleName):根據模塊名實例化模塊代理對象。為 每個模塊代理實例配備一個類管理器實例、一個對象管理器實例和一個模塊描述器實 例。getlnstance (String className, Datedate)根據類名和時間獲取類的實例對象, 將實例對象以泛型的形式返回。該方法通過調用objectManager的相應方法來實現。getlnstance (StringclassName, Date date, Object. . . object)根據類名、時間禾口構造函 數的參數對象列表來獲取類的實例對象,將實例對象以泛型的形式返回。該方法通過調用 objectManager 的相應方法來實現。getClassInstance (String className, Date date) 根據類名和時間獲取類的Class類型對象。該方法通過調用classManager的相應方法來 實現。其余方法為相應的getter方法,不再贅述。ObjectManager 1:subProxy 當 m ObjectManager ^ζΜ M PA M Wll^i 代理實例對象。ObjectManager(SuWroxy subProxy)創(chuàng)建實例時為其指定一個模塊代 理實例對象。ge nstance (String className, Date date)根據類名和時間獲取類的 實例對象,將實例對象以泛型的形式返回。該方法首先通過調用類管理器來獲取相應的 類對象,然后反射生成相應的實例對象。ge nstance (String className, Date date, Object. . . object)根據類名、時間和構造函數的參數對象列表來獲取類的實例對象,將實 例對象以泛型的形式返回。該方法首先通過調用類管理器來獲取相應的類對象,然后根據 相關參數反射生成相應的實例對象。ClassManager類包括suWroxy 當前ClassManager 實例對象所屬的模塊代理實例對象。ClassManager(SuWroxy subProxy)創(chuàng)建實例時為 其指定一個模塊代理實例對象。getClass (String className, Date date)根據類名和時 間來返回Class類型的對象。它將調用checkTime方法來決定返回新類類對象還是舊類類 對象。checkTime (String className, Date date)與更新時間對比,根據類名和日期來確 定應該加載哪個類。該方法通過調用ModuleDes類相關方法來實現。getNewName (Mring oldName)根據舊類名查找相應的新類名,該方法通過調用ModuleDes類相關方法來實現。ModuleDes類包括path 該模塊的模塊描述文件路徑。subProxy 當前 ClassManager實例對象所屬的模塊代理實例對象。nameMap 每個類名到新類名的映射 Μπ-ο timeMap :每個類名至 Ij 更新時 |、司的映射集合。ClassManager (SubProxy subProxy) 創(chuàng)建實例時為其指定一個模塊代理實例對象。SetNameMapO 從模塊描述文件中讀取 該模塊中所有類的更新信息,建立舊類名到新類名的映射集合,賦值給nameMap屬性。 getNewName (StringoldName)根據舊類名返回新類名。SetUpdateTimeMap ()從模塊 描述文件中讀取該模塊中所有類的更新信息,建立舊類名到更新時間的映射集合,賦值 給timeMap屬性。getUpdateTime (String className)根據舊類名返回類的更新時間。 setUpdate (String oldName, String newName, Date date):描述一條更新i己錄,艮向模塊 描述文件中寫入舊類名、新類名和更新時間的對應關系。com. evolution, tools包主要為動態(tài)更新子系統(tǒng)提供必要的工具類支持,主 要功能包括創(chuàng)建動態(tài)配置文件及其讀取和寫入、類依賴關系的解析、模塊依賴關系的解 析、文件及目錄的復制等工具。該包的設計主要是為了實現程序的清晰和復用。com. evolution, tools 包包括 CopyFiles 類、ElementForQueue 類、ForProxy 類、InverseType 類、ListClasses 類,其中,CopyFiles 類包括=CopyFiles ()空的構造函數。copy (String from, String to):拷貝單個文件,從一個目錄拷貝到另一個目錄。xcopy(String from, String to):拷貝目錄下所有文件,從一個目錄拷貝到另一個目錄。ElementForQueue類主要是為樹的層次遍歷提供一個數據結構,該數據結構對基 本元素進行包裝,以便遍歷時使用,包括=Ievel 包裝的元素所屬的層次。element 包裝的 元素。ElementForQueueO 空的構造函數。其余為相應的setter和getter方法,在此不
13再贅述。ForProxy類是總代理功能的補充,主要功能是進行動態(tài)更新系統(tǒng)的初始化工作。 該類繼承Httpkrvlet類,是一個krvlet類,包括Forfroxy ()空的構造函數。init() 重寫父類的方法,初始化動態(tài)更新系統(tǒng),應用服務器啟動后便運行。writeUnload (String moduleName):為指定個模塊生成空的模塊描述文件中。InverseType類主要功能是實現不同類型之間的轉換,包括=InverseType 私有 的空構造函數。conversion (Class changeClass)將包裝器類型的Class類型轉換為對應 的基本數據類型對應的Class類型。conversion (Class []cs)將類類型數組中包裝器類型 對應的Class類型轉換為基本數據類型的Class類型。conversion (Object [] obj)將對象 數組轉換為對應類類型的數組。ListClasses類主要負責讀取軟件信息挖掘子系統(tǒng)的結果。包括依賴關系的推理、 依賴樹的層次遍歷等功能,包括path 基路徑,尋找其他路徑的參照。relation 模塊描述 文件的路徑。mRelation 模塊依賴描述文件的路徑。saxReader :dom4j相關類。document dom4j 相關類。ListClassesO 空的構造函數。getModuleNamesByRelation()讀取模塊 依賴描述文件,按依賴關系返回所有的模塊名,其順序與依賴關系相反,即被依賴的模塊在 前。levelTraversal (Stringmodule)讀取一棵樹的所有類結點,自頂向下依層次遍歷該 樹,將遍歷結果放入List,然后逆序輸出。modlevelTraversal (Mring module)讀取一棵 樹的所有模塊結點,自頂向下依層次遍歷該樹,將遍歷結果放入List,然后逆序輸出。管理平臺主要包括三個類ListClasses、WriteUpdatehfo和 ModuleDes。其 中,ListClasses. JAVA的功能描述為這個類主要是讀取整個工程的依賴關系文件 relations, xml,從中獲取更新時要需要的所有相關信息,如根據類名查找其模塊名,返回 模塊總數等,同時再遍歷模塊時為每個模塊生成相應的模塊描述文件。其對應的接口描述public int getModuleNumO 讀取整個工程的依賴關系 relations, xml, 31 [Hi ^iJ ^v W Il ik !^ W. ;public List<String>getModuleNames ()
讀取整個工程的依賴關系文件relations, xml,返回所有的模塊名;publidtring getModuleName(int i)獲得依賴關系文件relations, xml中第i個模塊的名;public String getModuleName (String className)Mf^IifM Wll^i ^ ;public void
writeUnload(String name):根據類名為每個模塊生成空的配置文件;public List<Stri ng>levelTraversal (String module)讀取一棵樹的所有結點,自頂向下依層次遍歷該樹, 將遍歷結果放入List。WriteUpdateInfo. JAVA類功能描述為這個類主要完善各模塊對應的更新配置 文件,根據更新實施細節(jié)插入每個待更新類的新舊類名以及更新時間等信息。其對應的接口描述public void write (String name)根據name從依賴關系文 件relations, xml中讀取出其所屬的模塊,然后修改該模塊的更新配置文件中name對應的 節(jié)點,若已存在該類的配置信息,刪除,然后,插入最新更新后的類名(包名+類名)以及更 新時間。ModuleDes. JAVA類的功能描述為主要是管理模塊描述文件中的信息,包括查詢 以及寫入更新類的新舊類名以及類更新時間。其對應的接口描述publicString getNewName (String oldName):根據舊類名返回更新后的類名;public Date getUpdateTime (String className)根據舊類名返回更 新時間;public void setUpdate (String oldName, String newName, Date date):根據舊 類名完善各模塊的配置文件,插入新的類名以及更新時間。 本發(fā)明中的接口包括內部接口和外部接口,其中,內部接口主要是軟件資源挖掘 子系統(tǒng)與軟件動態(tài)更新子系統(tǒng)之間的接口,主要包括relations, xml、moduleRelations. xml等二個文件。下面分別具體描述一下這二個接口文件。 relations, xml
本配置文件是系統(tǒng)啟動時需要的配置文件之一,它主要記錄了整個系統(tǒng)內部的類
0093]
0094]關系。
0095]
0096]
0097]
0098]
0099]
0100] 0101] 0102]
0103]
0104]
0105]
0106]
0107]
0108]
0109]
0110] 0111] 0112]
0113]
0114]
0115]
0116]
0117]
0118]
0119]
0120] 0121] 0122] 0123]
< ? xml version = “ 1.0〃 encoding = “ UTF-8" ? > <rela tions>
〈module name ="模塊 1" > 〈level 1 name ="類 11" > <level2 name =〃 類 12〃 /> </levell> </module>
〈module name ="模塊 2" > 〈level 1 name =〃 類 21〃 /> </module>
</relations> moduleRelations. xml
該配置文件主要是記錄模塊之間的依賴關系,即模塊之間的調用關系。 < ? xml version = “ 1.0〃 encoding = “ UTF-8" ? > <moduleRelations>
〈module name ="模塊 1" > 〈level 1 name =〃 模塊 2〃 > 〈level2 name ="模塊 3〃 /> </levell> </module>
〈module name ="模塊 4" > 〈level 1 name =〃 模塊 5〃 > 〈level2 name ="模塊 6〃 /> </levell>
〈level 1 name ="模塊 7〃 /> </module> </moduleRelations>
關于外部接口,由于本發(fā)明的系統(tǒng)支持Windows系統(tǒng)和Unix系統(tǒng),支持對JAVA語
曰
開發(fā)的軟件系統(tǒng)進行操作。軟件資源挖掘子系統(tǒng)提供的用戶接口主要采用圖形界面的形式,文件監(jiān)視器監(jiān)視的文件目錄通過界面輸入實現。 軟件動態(tài)更新子系統(tǒng)為開發(fā)人員提供的接口主要是指開發(fā)人員必須堅持面向接 口編程,主要的編程規(guī)則如下
0125]1)所有類均按接口編程。
0126]2)每個類都有私有屬性date和相應的getter和setter方法。
0127]3)每當創(chuàng)建對象實例時按以下方式創(chuàng)建
0128]NewObject no = Proxy, getlnstance (java. lang. String className,
0129]java. util. Date date,
0130]java. lang. Object. . . args);
no. sayHello ();參數className :完整類名形如com. evolution, χχ-date 時間屬性args 參數對象數 組4)在靜態(tài)方法中創(chuàng)建對象實例時按以下方式創(chuàng)建NewObject no = Proxy, getlnstance(java. lang. String thisClassName,java. lang. String thisMethodName,java. lang. String cIassNameToGet,java. lang. Object. . . args);no. sayHello ();參數thisClassName :該靜態(tài)方法所在的類的完全限定名-thisMethodName 該靜態(tài)方
法的名稱classNameToGet 要獲取的實例對象對應的類名args 參數對象數組
0141]5)調用靜態(tài)方法時按以下方式調用
0142]Proxy. staticCall (java. util. Date date,
0143]java. lang. String className,
0144]java. lang. String methodName,
0145]java. lang. Object. . . args);
0146]參數
0147]第一個參數是調用方法的時間,第二個參數是類名,第三個參數是方法名,其余是
方法的參數列表6)調用新增方法時按以下方式調用Interface 1 instance = Proxy, getlnstance ( “ A “,date,1, “ test “); instance, call(object, “ methodl“,argsO,argsl,·…);新增的方法屬于類A參數第一個參數是調用方法的對象,第二個參數是方法名,其余是方法的參數列表軟件動態(tài)更新子系統(tǒng)提供了用戶接口是一個可視化的管理界面。系統(tǒng)總體流程分以下四個部分,正常運行時基本從部署前開始,對客戶軟件系統(tǒng) 進行分析處理流程(1.1),然后對處理后的客戶系統(tǒng)以及分析得到的配置文件同時部署,運行系統(tǒng)即可以進行更新流程(1. 和新增操作,新增前要對新增的模塊進行分析處理 (1.3),之后可以正常新增(1.4)。1. 1客戶軟件系統(tǒng)部署前處理流程圖4為本發(fā)明客戶軟件系統(tǒng)部署前及新增前的處理流程圖,如圖4所示,步驟1. 1 的具體處理流程具體如下資源挖掘子系統(tǒng)啟動,接收客戶軟件系統(tǒng)掃描指令,接收客戶軟件系統(tǒng)掃描路徑 輸入,由系統(tǒng)文件監(jiān)視器監(jiān)視該路徑,確認該目錄是否存在,不存在則提示錯誤,存在則提 取路徑下文件目錄,由源碼加載分析器對上一步獲取的源代碼文件目錄列表進行分析,以 文件為單位以字符流的方式加載到內存,由系統(tǒng)類分析器對系統(tǒng)文件監(jiān)視器中產生的文件 目錄進行分析,提取客戶軟件系統(tǒng)中所有的類及類本身的信息,將該類本身的信息依次注 冊到中間文件classRelation. xml中,由類依賴關系產生器讀取類分析器產生的類信息, 并結合類本身的信息,在源代碼加載分析器加載的源代碼信息中進行逆向分析,產生每個 類對于其他類的依賴關系,并將產生的依賴關系依次注冊到中間文件classRelation. xml 中。由樹或有向圖依賴依賴關系產生器根據類依賴關系,結合類本身的信息產生相應的依 賴關系樹結構或有向圖結構,由模塊劃分產生器對依賴關系樹結構或有向圖結構進行分 割,以產生模塊結構,模塊結構產生后便可以產生包含有模塊劃分和模塊內部所有類關系 的配置文件relations, xml和模塊間依賴關系的配置文件moduleRelations. xml。資源挖 掘子系統(tǒng)運行結束。1. 2客戶軟件系統(tǒng)運行啟動及更新流程圖5為本發(fā)明客戶軟件系統(tǒng)運行時的流程圖,如圖5所示,客戶軟件系統(tǒng)運行啟動 及更新流程包括經過分析的客戶軟件系統(tǒng)和由(1. 1)流程中分析得到的配置文件relations, xml 和moduleRelations. xml同時部署到服務器上,配置web. xml,將啟動所需的Servlet配置 到服務器上。系統(tǒng)運行,軟件動態(tài)更新系統(tǒng)初始化,讀取配置文件relations, xml和 moduleRelations. xml,由總代理模塊的注冊中心生成配置文件register, xml,并將所讀取 的類和模塊信息注冊到該配置文件中,由總代理模塊的工廠模塊生成模塊代理和對應模塊 的描述文件moduleA. xml (Α對應著不同的模塊名),系統(tǒng)正常運行。管理平臺運行,系統(tǒng)按依賴關系列出所有的模塊及模塊內部的類,通過圖形界面 的形式顯示出來。管理平臺接收更新指令,接收更新模塊選擇輸入,接收更新類選擇輸入,接收對應 新類輸入,根據更新前類名提取出新類所在位置,將新類拷貝到對應的目錄中。以上操作由 管理平臺實現。拷貝完成,由總代理的時間戳模塊將更新前后的類名及更新時間寫入類所 在模塊的描述文件中,供類使用時區(qū)分。1. 3客戶軟件系統(tǒng)新增前處理流程圖4為本發(fā)明客戶軟件系統(tǒng)部署前及新增前的處理流程圖,如圖4所示,客戶軟件 系統(tǒng)新增前處理流程包括資源挖掘子系統(tǒng)系統(tǒng)啟動,接收新增掃描指令,接收系統(tǒng)整體掃描路徑輸入,接收 系統(tǒng)新增模塊掃描路徑,由系統(tǒng)文件監(jiān)視器監(jiān)視相關路徑,確認該目錄是否存在,不存在則
17提示錯誤,存在則提取路徑下文件目錄,由源碼加載分析器對上一步獲取的新增模塊源代 碼文件目錄列表進行分析,以文件為單位以字符流的方式加載到內存,由系統(tǒng)類分析器對 系統(tǒng)文件監(jiān)視器中產生的文件目錄進行分析,提取客戶軟件系統(tǒng)中所有的新增類及類本 身的信息(包含新增類所依賴的類),由類依賴關系產生器讀取類分析器產生的類信息, 并結合類本身的信息,在源代碼加載分析器加載的新增源代碼信息中進行逆向分析,產生 每個新增類對于其他類(包含原有類)的依賴關系,并將產生的依賴關系依次注冊到配 置文件addRelations. xml中。同時產生新增模塊中模塊間的依賴關系,注冊到配置文件 addModuleRelations. xml。資源挖掘子系統(tǒng)運行結束。1. 4客戶軟件系統(tǒng)運行時新增流程圖5為本發(fā)明客戶軟件系統(tǒng)運行時的流程圖,如圖5所示,客戶軟件系統(tǒng)運行時新 增流程包括管理平臺接收新增指令,接收新增模塊選擇輸入(壓縮格式),接收新增類配置 文件addRelations. xml,接收新增模塊配置文件addModuleRelations. xml,對新增模塊解 壓縮并將解壓后的類拷貝入目標位置,該位置由新增模塊的內部文件結構指定。由管理平 臺讀入配置文件addRelations. xml,對其進行修剪并將修剪后的信息加入relations, xml 配置文件,讀入配置文件addModuleRelations. xml,對其進行修剪并將修剪后的信息加入 moduleRelations. xml配置文件。由總代理模塊的注冊中心將新增的類和模塊信息注冊到 注冊中心,即加入到配置文件register, xml中,由總代理模塊的工廠模塊生成新增模塊的 模塊代理和對應模塊的描述文件moduleA. xml (Α對應著不同的模塊名),新系統(tǒng)正常運行。本領域技術人員應當理解,本發(fā)明中的模塊化JAVA應用軟件在線更新方法可參 見前述模塊化JAVA應用軟件在線更新系統(tǒng)的相關描述而理解。以上所述,僅為本發(fā)明的較佳實施例而已,并非用于限定本發(fā)明的保護范圍。
權利要求
1.一種模塊化JAVA應用軟件在線更新系統(tǒng),其特征在于,包括有軟件資源信息挖掘子 系統(tǒng)和軟件動態(tài)更新子系統(tǒng),其中,所述軟件資源信息挖掘子系統(tǒng)包括有系統(tǒng)文件監(jiān)視器、 源代碼加載分析器、系統(tǒng)類分析器、類依賴關系產生器、樹或有向圖依賴關系產生器和模塊 劃分產生器;其中所述系統(tǒng)文件監(jiān)視器用于配置客戶軟件系統(tǒng)的監(jiān)控目錄并提取出所述監(jiān)控目錄中的 文件信息;所述源代碼加載分析器用于將所述客戶軟件系統(tǒng)中獲取的源代碼文件以文件為單位 以字符流的方式加載到內存;所述系統(tǒng)類分析器用于從所述客戶軟件系統(tǒng)中獲取文件信息及源代碼中提取出所述 客戶軟件系統(tǒng)中所有的類及類本身的信息,并將所述類本身的信息依次注冊到接口描述文 件中;所述類依賴關系產生器用于讀取所述系統(tǒng)類分析器產生的類信息,并結合所述類本身 的信息在所述源代碼加載分析器中進行逆向分析,產生每個類對其它類的依賴關系,并將 產生的關系依次注冊到所述接口描述文件中;所述樹或有向圖依賴關系產生器用于讀取所述類依賴關系產生器中產生的類的依賴 關系,并結合所述類本身的信息產生相應的依賴關系樹結構或有向圖,以供所述軟件動態(tài) 更新子系統(tǒng)進行分析讀取,以在更新過程中確定類的加載順序;所述模塊劃分產生器用于對所述客戶軟件系統(tǒng)以依賴關系為單位進行模塊劃分,并產 生模塊結構,將所述模塊結構提供給所述軟件動態(tài)更新子系統(tǒng),所述軟件動態(tài)更新子系統(tǒng) 在更新時按照所劃分的模塊分別按階段獨立更新;所述軟件動態(tài)更新子系統(tǒng)包括有接口、總代理單元、模塊代理單元及管理平臺;其中 所述總代理單元用于在接收到用戶輸入的待加載的類的參數后生成所述類的實例對 象或應用程序的調用結果;所述模塊代理單元用于利用用戶輸入的類的參數對管理模塊內所有類的加載、對象的 實例化和類的更新;管理平臺用于管理所述客戶軟件系統(tǒng),并為所述軟件動態(tài)更新子系統(tǒng)提供必要的工具 支持,主要包括創(chuàng)建動態(tài)配置文件及其讀取和寫入、類依賴關系的解析、模塊依賴關系的解 析、文件及目錄的復制工具;所述接口包括內部接口和外部接口,所述內部接口為所述軟件資源挖掘子系統(tǒng)與所述 軟件動態(tài)更新子系統(tǒng)之間的接口 ;所述外部接口用于向開發(fā)人員提供編程接口及類的參數 輸入接口。
2.根據權利要求1所述的系統(tǒng),其特征在于,所述總代理單元包括工廠模塊,用于負責創(chuàng)建和維護所述模塊代理單元處理的實例,即維護模塊名到實例 的映射,并將所述總代理單元的請求進行參數處理,調用對應的模塊代理單元進行處理;在 當前請求為獲取對象請求時,在將實例對象返回給所述總代理單元之前觸發(fā)時間戳模塊, 通過對所述代理實例對象設定時間戳后再返回給所述總代理單元;時間戳模塊,用于在應用軟件更新時,記錄下所有更新類的更新時刻,接收到應用系統(tǒng) 對所述應用軟件的調用請求時,首先將參數中的時間與所設置的更新時間戳進行對比,若 早于更新時間則返回調用舊類的結果,否則返回調用更新后的類的結果;在應用請求為獲取對象請求時,在實例對象返回給應用請求之前設定其生成時間,即將實例對象的屬性字 段設定為當前的時間;注冊中心,用于記錄當前所有的模塊及每個模塊涉及的具體的類、確定所述類是否注 冊及其所屬的模塊。
3.根據權利要求1所述的系統(tǒng),其特征在于,所述模塊代理單元包括對象管理器,用于根據索取的對象實例的具體請求來返回不同的實例對象;即通過調 用類加載器索取類的類型對象,并通過反射方式返回實例化對象;類加載器,用于根據請求將指定的類文件加載至內存,同時返回對應類的類型對象的 引用;通過調用模塊描述器讀取當前請求類的更新時間,之后與參數中的時間進行對比,若 所述參數的時間早于時間戳的時間則返回舊的類的類型實例對象,否則返回新的類的類型 實例對象;模塊描述器,用于描述模塊內所有類文件的信息,包括類名、類名所對應的路徑、有無 更新、對應更新后類的信息、更新的時間點。
4.根據權利要求1所述的系統(tǒng),其特征在于,所述類依賴關系產生器先使用正則表達 式將源文件中的所有非編譯部分的注釋全部去除,然后通過總結一個類在JAVA源代碼中 被調用的方式,使用正則表達式與類名進行組合,然后再在全文件中進行搜索匹配,保證依 賴關系生成的正確性。
5.根據權利要求1所述的系統(tǒng),其特征在于,所述模塊劃分產生器在模塊劃分的過程 中對每個模塊設立標志位,對于縱向劃分過程中使用切割生成的模塊,對于其他模塊有依 賴關系進行標志,并對模塊下的起始類設置上層關聯(lián)類存儲字段以存儲在切割之前的上層 類,通過該上層類所在的模塊而確定模塊之間的依賴關系。
6.一種模塊化JAVA應用軟件在線更新方法,其特征在于,包括監(jiān)視客戶軟件系統(tǒng)輸入的掃描路徑,提取并分析掃描路徑下的文件目錄,以文件為單 位以字符流的方式加載到內存;對系統(tǒng)文件監(jiān)視器中生成的文件目錄進行分析,提取客戶 軟件系統(tǒng)中所有的類及類信息,并將類信息注冊到所設置的中間文件中;讀取所述類信息, 并在所加載的源代碼信息中進行逆向分析,產生每個類對于其他類的依賴關系,并將產生 的依賴關系依次注冊到所述中間文件中;根據類之間的依賴關系,結合類信息生成依賴關 系樹結構或有向圖結構,并對依賴關系樹結構或有向圖結構進行分割,生成模塊結構,同時 生成包含有模塊劃分和模塊內部所有類關系的類配置文件和模塊間依賴關系的模塊配置 文件;并將兩配置文件部署到服務器上,同時配置啟動所需的文件;讀取類配置文件和模 塊配置文件,將從上述類配置文件和模塊配置文件中讀取的類和模塊信息注冊到注冊中心 新生成的新配置文件中,并生成模塊代理和對應模塊的描述文件;接收到更新類的選擇輸入后,根據更新前類名提取出新類所在位置,將新類拷貝到對 應的文件目錄中;接收新增掃描指令后,監(jiān)視所輸入的掃描路徑,提取并分析掃描路徑下的新增模塊源 代碼文件目錄列表,以文件為單位以字符流的方式加載到內存,并對系統(tǒng)文件監(jiān)視器中產 生的文件目錄進行分析,提取客戶軟件系統(tǒng)中所有的新增類及類信息,讀取所述類信息,在 加載的新增源代碼信息中進行逆向分析,生成每個新增類對于其他類的依賴關系,并將生 成的依賴關系依次注冊到新增類模塊配置文件中,同時生成新增模塊間的依賴關系,注冊到新增配置文件中;根據新增類配置文件及新增模塊配置文件,對新增模塊解壓縮,并將解 壓后的類拷貝入目標位置,該位置由新增模塊的內部文件結構指定;讀入所述模塊配置文 件,對其進行修剪并將修剪后的信息加入所述類配置文件中,讀入新增模塊配置文件,對其 進行修剪并將修剪后的信息加入所述模塊配置文件中;將新增的類和模塊信息注冊到注冊 中心,即加入到所述新配置文件中,并生成新增模塊的模塊代理和對應模塊的描述文件,執(zhí) 行所述掃描文件。
7.根據權利要求6所述的方法,其特征在于,所述方法還包括在當前請求為獲取對象請求時,在將實例對象返回之前觸發(fā)時間戳模塊,通過對所述 代理實例對象設定時間戳后再返回實例對;在應用軟件更新時,記錄下所有更新類的更新時刻,接收到應用系統(tǒng)對所述應用軟件 的調用請求時,首先將參數中的時間與所設置的更新時間戳進行對比,若早于更新時間則 返回調用舊類的結果,否則返回調用更新后的類的結果;在應用請求為獲取對象請求時,在 實例對象返回給應用請求之前設定其生成時間,即將實例對象的屬性字段設定為當前的時 間;注冊中心記錄當前所有的模塊及每個模塊涉及的具體的類、確定所述類是否注冊及其 所屬的模塊。
8.根據權利要求7所述的方法,其特征在于,所述方法還包括根據索取的對象實例的具體請求來返回不同的實例對象;即通過調用類加載器索取類 的類型對象,并通過反射方式返回實例化對象;根據請求將指定的類文件加載至內存,同時 返回對應類的類型對象的引用;通過調用模塊描述器讀取當前請求類的更新時間,之后與 參數中的時間進行對比,若所述參數的時間早于時間戳的時間則返回舊的類的類型實例對 象,否則返回新的類的類型實例對象;以及,描述模塊內所有類文件的信息,包括類名、類名 所對應的路徑、有無更新、對應更新后類的信息、更新的時間點。
9.根據權利要求6所述的方法,其特征在于,所述方法還包括先使用正則表達式將源文件中的所有非編譯部分的注釋全部去除,然后通過總結一個 類在JAVA源代碼中被調用的方式,使用正則表達式與類名進行組合,然后再在全文件中進 行搜索匹配,保證依賴關系生成的正確性。
10.根據權利要求6所述的方法,其特征在于,在模塊劃分的過程中,對每個模塊設立 標志位,對于縱向劃分過程中使用切割生成的模塊,對于其他模塊有依賴關系進行標志,并 對模塊下的起始類設置上層關聯(lián)類存儲字段以存儲在切割之前的上層類,通過該上層類所 在的模塊而確定模塊之間的依賴關系。
全文摘要
本發(fā)明公開了一種模塊化JAVA應用軟件在線更新系統(tǒng),包括有軟件資源信息挖掘子系統(tǒng)和軟件動態(tài)更新子系統(tǒng),其中,所述軟件資源信息挖掘子系統(tǒng)包括有系統(tǒng)文件監(jiān)視器、源代碼加載分析器、系統(tǒng)類分析器、類依賴關系產生器、樹或有向圖依賴關系產生器和模塊劃分產生器;所述軟件動態(tài)更新子系統(tǒng)包括有接口、總代理單元、模塊代理單元及管理平臺;總代理單元包括工廠模塊、時間戳模塊和注冊中心;模塊代理單元包括對象管理器、類加載器和模塊描述器。本發(fā)明不必重新啟動業(yè)務系統(tǒng)即可實現業(yè)務的加載。本發(fā)明同時公開了一種模塊化JAVA應用軟件在線更新方法。本發(fā)明在不重啟系統(tǒng)的情況下實現了業(yè)務的加載。
文檔編號G06F9/445GK102141919SQ20101010322
公開日2011年8月3日 申請日期2010年1月28日 優(yōu)先權日2010年1月28日
發(fā)明者孟祥武, 張玉潔, 王闖 申請人:北京郵電大學