專利名稱::用于應(yīng)用程序執(zhí)行的動(dòng)態(tài)java類的加載的制作方法本申請(qǐng)涉及到美國(guó)專利申請(qǐng)No.______(代理人文檔號(hào)No.AP116H0),它與本申請(qǐng)?jiān)谕惶焯峤徊⑶以撋暾?qǐng)的標(biāo)題為″動(dòng)態(tài)類的打包″。該申請(qǐng)?jiān)诖艘靡怨﹨⒖?。圖1所示的塊圖100繪制了現(xiàn)有技術(shù)方式,即從因特網(wǎng)上通過web瀏覽器,例如InternetExplorerTM或者NetscapeNavigatorTM等下載可執(zhí)行程序來運(yùn)行Java應(yīng)用程序。服務(wù)器102含有超文本標(biāo)記語言(HTML)網(wǎng)頁104。HTML網(wǎng)頁104下載到客戶端108中,下載是從因特網(wǎng)106通過web瀏覽器110實(shí)現(xiàn)的。ActiveX控件112下載到客戶端108并由web瀏覽器110運(yùn)行它。ActiveX控件包括對(duì)象鏈接和嵌入控件(OCX)114,含有Java程序和類文件的zip文件116以及.inf文件,該.inf文件給系統(tǒng)提供了安裝OCX114和zip文件116所必須的信息。一旦ActiveX112控件被執(zhí)行,則來自zip文件116的Java程序就能夠被執(zhí)行了。OCX,.zip文件和.inf文件被打包為.cab文件。因此,ActiveX通過web瀏覽器安裝.cab文件并解壓縮zip文件以運(yùn)行不同的Java應(yīng)用類。因?yàn)樵贘ava應(yīng)用程序運(yùn)行之前,必須下載完整的.cab文件,所以如果使用現(xiàn)有技術(shù)方式來下載應(yīng)用程序,那么由此而強(qiáng)加的延遲就會(huì)使用戶不愿從因特網(wǎng)上下載應(yīng)用程序,除非用戶能使用快速的上網(wǎng)方式。例如,如果使用56K的撥號(hào)調(diào)制解調(diào)器,下載和安裝一個(gè)典型.cab文件可能要花費(fèi)5分鐘或者更多的時(shí)間。即使用戶不用某些類,在應(yīng)用功能實(shí)現(xiàn)之前,用戶也必須要等待足夠的時(shí)間來下載所有包含于zip文件的類。因?yàn)?cab文件會(huì)隨著更多的或者增強(qiáng)的功能的增多而變大,所以等待的時(shí)間也會(huì)隨著軟件功能的增強(qiáng)而進(jìn)一步增加。盡管在首次下載應(yīng)用程序時(shí)會(huì)存在這種問題,然而它也會(huì)延伸到應(yīng)用程序的更改。例如,如果對(duì)已存在的程序進(jìn)行了1KB的新修正或者更新的修改,那么用戶將不得不下載整個(gè)應(yīng)用程序或者發(fā)郵件定購(gòu)裝有已修正的應(yīng)用程序的光盤或者軟盤。然而,為了盡量降低成本,公司一直都希望用戶通過因特網(wǎng)下載文件而不是通過裝運(yùn)光盤或者軟盤的方式來獲得新的或者已修正的應(yīng)用程序。盡管在有些情況下能夠給出補(bǔ)丁程序,然而補(bǔ)丁程序的管理卻不容易控制。例如,當(dāng)要安裝多個(gè)補(bǔ)丁的時(shí)候,在后來得到的補(bǔ)丁安裝時(shí),早期的補(bǔ)丁要么還沒有安裝要么在后來的補(bǔ)丁之后安裝,問題就會(huì)出現(xiàn)。在這種情況下,程序就可能不會(huì)正確地運(yùn)行并且隨著將來的補(bǔ)丁的發(fā)布,問題本身也會(huì)變得很混亂。因此,補(bǔ)丁安裝的管理就使補(bǔ)丁成為一種不可行的選擇方案。因此,有必要解決現(xiàn)有技術(shù)的問題以提供一種用于快速有效地從因特網(wǎng)上下載應(yīng)用程序的方法,下載的同時(shí)還保持了對(duì)用戶是可用的應(yīng)用程序的功能。在一種實(shí)施方案中,給出了計(jì)算機(jī)實(shí)現(xiàn)的方法,它由通用計(jì)算機(jī)執(zhí)行,它能夠?qū)⒖蓤?zhí)行程序從聯(lián)網(wǎng)存儲(chǔ)器中下載到通用計(jì)算機(jī)。該方法以核心模塊的下載開始,這里的核心模塊包括運(yùn)行可執(zhí)行程序的引擎所必須的類。然后,安裝核心模塊,這將進(jìn)而提供即時(shí)的用戶功能。安裝的核心模塊包括以下這樣的代碼,該代碼用于請(qǐng)求與核心模塊沒有關(guān)聯(lián)的類;為請(qǐng)求的類搜索可執(zhí)行程序的非核心模塊;以及在可執(zhí)行程序提供用戶功能的同時(shí),給通用計(jì)算機(jī)下載包含被請(qǐng)求的類的非核心模塊。在另一種實(shí)施方案中,給出了一種方法,它用于在多線程環(huán)境中下載應(yīng)用程序的模塊。在下載進(jìn)行的同時(shí),應(yīng)用程序的核心模塊正在運(yùn)行,它允許用戶應(yīng)用和應(yīng)用程序的各種特征進(jìn)行交互。核心模塊執(zhí)行的方法以正被請(qǐng)求的第一個(gè)模塊開始,同時(shí)第二個(gè)模塊正在下載。然后,掛起第二個(gè)模塊的下載。下一步,下載第一個(gè)模塊。接著,在第一個(gè)模塊的下載完成之后,第二個(gè)模塊的下載繼續(xù)進(jìn)行,由此正在運(yùn)行的應(yīng)用程序就能夠使用戶應(yīng)用程序?qū)竟δ艿慕换ヒ蚝诵哪K而變得容易。此外,應(yīng)用程序正在運(yùn)行的同時(shí),一旦完成后臺(tái)的安裝,就能夠使用由第一個(gè)模塊和第二個(gè)模塊中的每一個(gè)所提供的功能。另外還有一種實(shí)施方案中,給出了一種方法,用于將模塊從分布式網(wǎng)絡(luò)上下載到通用計(jì)算機(jī)中供應(yīng)用程序使用,下載的同時(shí)應(yīng)用程正在通用計(jì)算機(jī)上運(yùn)行。方法以啟用對(duì)應(yīng)用程序的選擇開始。接著,運(yùn)行被選擇應(yīng)用程序的引擎的核心模塊被識(shí)別。下一步,下載和安裝核心模塊。下一步,啟動(dòng)對(duì)應(yīng)用程序的非核心模塊相關(guān)特征的選擇。為了響應(yīng)對(duì)非核心模塊相關(guān)特征的選擇,該方法包括,確定非核心模塊是否在本地通用計(jì)算機(jī)上,如果非核心模塊不在本地,從分布式網(wǎng)絡(luò)上下載非核心模塊,以及安裝非核心模塊。確定、下載和安裝正被執(zhí)行的同時(shí),啟用用戶對(duì)核心模塊已安裝的特征的訪問與交互。在再另外一種實(shí)施方案中,給出了一種計(jì)算機(jī)實(shí)現(xiàn)的方法,用于將應(yīng)用程序安裝到通用計(jì)算機(jī)上。該方法以確定核心模塊是否在本地通用計(jì)算機(jī)上開始。該確定包括,如果核心模塊在本地通用計(jì)算機(jī)上,則確定其是否是最近的版本。為了響應(yīng)核心模塊不在或者核心模塊不是最近版本,方法進(jìn)一步包括核心模塊的下載,這里核心模塊包括運(yùn)行應(yīng)用程序的引擎所必須的類。接著,安裝核心模塊。安裝的核心模塊提供即時(shí)的用戶功能。下一步,非核心模塊是否短缺被預(yù)測(cè)。然后,在應(yīng)用程序正在執(zhí)行的同時(shí),下載所預(yù)測(cè)的非核心模塊。在還有另一種實(shí)施方案中,給出了一種方法,用于將計(jì)算機(jī)程序從網(wǎng)絡(luò)上下載到通用計(jì)算機(jī)上,此處計(jì)算機(jī)應(yīng)用程序被劃分為模塊。該方法以下載核心模塊開始。核心模塊包括運(yùn)行計(jì)算機(jī)程序引擎所必須的類。接著,安裝核心模塊。安裝的核心模塊給出即時(shí)的用戶功能。下一步,根據(jù)優(yōu)先權(quán)列表下載非核心模塊。接著,根據(jù)用戶請(qǐng)求的特征功能,請(qǐng)求一個(gè)既沒有被下載也不是正在被下載的非核心模塊。下一步,根據(jù)優(yōu)先權(quán)列表暫停非核心模塊的下載。接著,啟動(dòng)該含有特征功能的非核心模塊的下載。下一步,安裝非核心模塊。然后,根據(jù)優(yōu)先權(quán)列表繼續(xù)下載非核心模塊。在另一種實(shí)施方案中,給出了一種裝置,用于下載應(yīng)用程序。裝置包括存儲(chǔ)單元,用于存儲(chǔ)執(zhí)行應(yīng)用程序的編碼指令。裝置也包括監(jiān)視器,用于給用戶顯示應(yīng)用程序的特征。應(yīng)用程序特征與應(yīng)用程序的模塊相關(guān)聯(lián),模塊包含執(zhí)行應(yīng)用程序特征的編碼指令。裝置還包括處理器。處理器要配置以處理編碼指令,其中編碼指令要被配置成下載和安裝應(yīng)用程序的核心模塊。核心模塊能夠運(yùn)行應(yīng)用程序的引擎并且立即允許用戶和應(yīng)用程序交互,其中根據(jù)用戶選擇的與非核心模塊相關(guān)的一個(gè)應(yīng)用程序特征,下載,安裝和啟用非核心模塊以使用即時(shí)功能,同時(shí)一起使用核心模塊所提供的功能。在另外還有一種實(shí)施方案中,給出了一種計(jì)算機(jī)可讀媒體,它包含用于從網(wǎng)絡(luò)上下載可執(zhí)行程序的程序指令。計(jì)算機(jī)可讀媒體的例子包括下載核心模塊的程序指令,此處核心模塊包括運(yùn)行可執(zhí)行程序的引擎所必須的指令。此外,計(jì)算機(jī)可讀媒體包括安裝核心模塊的程序指令。安裝的核心模塊更深一層地包括這樣的程序指令,該程序指令用于請(qǐng)求與核心模塊沒有關(guān)聯(lián)的類,搜索非核心模塊以獲取被請(qǐng)求的類,以及在可執(zhí)行程序提供用戶功能的同時(shí),下載包含被請(qǐng)求的類的非核心模塊。本發(fā)明有許多優(yōu)點(diǎn)。最值得注意的是,可執(zhí)行程序能夠通過分布式網(wǎng)絡(luò)高效地下載。通過下載包含運(yùn)行應(yīng)用程序的引擎所必須的代碼的核心模塊,用戶就能夠運(yùn)行程序而不必忍受任何過分的延遲,即使是用撥號(hào)連接方式來下載。此外,預(yù)測(cè)用戶需要的用于下載的模塊的能力或者后臺(tái)下載模塊能力以一種對(duì)用戶透明的方式提供了更高的靈活性和效率。本發(fā)明的其它方面和優(yōu)點(diǎn)將隨著下列結(jié)合對(duì)應(yīng)附圖的詳細(xì)描述,以及用舉例方式對(duì)發(fā)明原理的圖解而變得清晰。圖1所示為塊圖,繪制了現(xiàn)有技術(shù)方式,即從因特網(wǎng)上通過web瀏覽器下載可執(zhí)行程序,并運(yùn)行Java應(yīng)用程序。圖2所示為流程圖,繪制了按照本發(fā)明的一種實(shí)施方案從因特網(wǎng)上下載應(yīng)用程序的方法概況。圖3所示為流程圖,繪制了按照本發(fā)明的一種實(shí)施方案的一種高層方法,它周Java加載器下載和安裝應(yīng)用程序。圖4所示為塊圖,顯示了按照本發(fā)明的一種實(shí)施方案在圖3的操作146中下載的模塊列表。圖5所示為按照本發(fā)明的一種實(shí)施方案的流程圖,展示了一種方法,在需要的時(shí)候,應(yīng)用程序正在運(yùn)行的同時(shí),進(jìn)行模塊的下載和安裝。圖6所示為按照本發(fā)明的一種實(shí)施方案的流程圖,更詳細(xì)地描述了應(yīng)用程序的模塊的下載。圖7所示為按照本發(fā)明的一種實(shí)施方案的流程圖,更詳細(xì)地描述了圖6的操作190,圖中包含請(qǐng)求類的模塊通過類加載器線程而被定位。圖8所示為按照本發(fā)明的一種實(shí)施方案的流程圖,它表示一種方法,一旦主應(yīng)用程序已經(jīng)啟動(dòng),它用于在多線程環(huán)境中執(zhí)行后臺(tái)下載。圖9所示為按照本發(fā)明的一種實(shí)施方案的塊圖,表示將被下載的用于應(yīng)用程序的各種模塊的優(yōu)先權(quán)列表。圖10所示為按照本發(fā)明的一種實(shí)施方案的流程圖,更詳細(xì)地描述了圖7的操作208,圖中,模塊的下載是在多線程環(huán)境中根據(jù)下載管理器邏輯實(shí)現(xiàn)的。本發(fā)明的實(shí)施方案提供了這樣的方法和裝置,它們通過因特網(wǎng)高效地將應(yīng)用程序組件從位于中心的源(例如,硬件和軟件銷售商)分發(fā)到終端用戶。在一種實(shí)施方案中,用戶能夠訪問網(wǎng)上站點(diǎn)以選擇不同應(yīng)用和選項(xiàng)。如在這里所用的,能夠高效地處理和下載應(yīng)用及組件的實(shí)施方案,通常適用于任何類型的應(yīng)用和應(yīng)用組件。然而,為了便于論述,將會(huì)引用適用于打印機(jī)用戶的打印機(jī)和應(yīng)用選項(xiàng)。這些應(yīng)用和選項(xiàng)可以在,例如,銷售商的站點(diǎn)找到。參照這個(gè)例子,關(guān)于打印機(jī)的應(yīng)用程序可以是用于創(chuàng)建賀卡、請(qǐng)柬、圖書封面、圖片模板、名片、禮品包裝紙以及禮品盒等。一旦用戶選擇了一個(gè)應(yīng)用選項(xiàng),則該應(yīng)用選項(xiàng)會(huì)有額外的許多可供選擇的子選項(xiàng)。在一種實(shí)施方案中,可選擇一個(gè)選項(xiàng),其中可以包括更多的內(nèi)容來生成一種方案,例如給賀卡添加一附圖。在一種實(shí)施方案中,作為完整程序的所有程序的選擇項(xiàng),或者程序選擇項(xiàng)組,能夠被識(shí)別,并且為每個(gè)選擇項(xiàng)或者選擇項(xiàng)組創(chuàng)建一個(gè)軟件類模塊。所選擇的模塊中每個(gè)都包含實(shí)現(xiàn)特定程序任務(wù)必須的所有的類。例如,一個(gè)模塊可能包括生成圖形用戶界面(GUI)用的所有的類,另一個(gè)模塊用于選擇和下載圖象,第三個(gè)用于打印,第四個(gè)用于旋轉(zhuǎn)和剪切圖象等等。在一種實(shí)施方案中,至少一個(gè)模塊必須包括運(yùn)行該實(shí)施方案中應(yīng)用程序的引擎所必須的核心類。核心模塊可以從命令行接收指令,或者更優(yōu)選方式是,核心模塊下載和安裝GUI模塊以給用戶提供更加方便的界面。為了加速程序的下載,在可執(zhí)行程序?qū)⒈幌螺d之前,首先僅下載核心模塊。然后,由核心模塊來下載和安裝GUI模塊,它給用戶顯示各種程序選項(xiàng)。在一種實(shí)施方案中,程序正在運(yùn)行的同時(shí),如果用戶選擇的選項(xiàng)不是核心模塊的一部分,那么核心模塊就進(jìn)行檢查以確定能夠?qū)崿F(xiàn)被選擇項(xiàng)的模塊是否在本地(例如,在用戶驅(qū)動(dòng)器或者網(wǎng)絡(luò)驅(qū)動(dòng)器上)。在另一種實(shí)施方案中,如果需要的模塊不在本地,那么需要的模塊就從因特網(wǎng)上下載并且自動(dòng)上載到正在運(yùn)行的程序。如果需要的模塊以前已被下載過,那么核心模塊就進(jìn)行檢查以確定需要的模塊的當(dāng)前版本是否比核心模塊的版本老。如果有該版本,需要的模塊并不比核心模塊老,則使用本地可用的模塊,但如果需要的模塊是更老的,那么從因特網(wǎng)上下載更新的模塊。在另一種實(shí)施方案中,應(yīng)用程序可以根據(jù)當(dāng)前用戶的選擇預(yù)測(cè)將來所需的模塊,并可以在后臺(tái)下載更多的模塊,這里這些模塊是核心模塊認(rèn)為在不遠(yuǎn)的將來會(huì)用到的。例如,如果用戶使用應(yīng)用程序下載并編輯了一幅照片圖象,則該應(yīng)用程序的核心模塊可能會(huì)認(rèn)為用戶將可能想要打印所編輯的圖象。在這種情況下,打印模塊可能在用戶完成編輯之前就下載了,因此允許用更快更高效的方式從因特網(wǎng)上下載可執(zhí)行的文件,并且下載的同時(shí)用戶仍然能使用應(yīng)用程序的全部功能。在再一種實(shí)施方案中,模塊預(yù)測(cè)性的下載可以根據(jù)觀察用戶的行為的統(tǒng)計(jì)分析進(jìn)行,從而就可將似乎與程序無關(guān)的選擇項(xiàng)鏈接起來以在后臺(tái)下載。圖2所示為按照本發(fā)明的一種實(shí)施方案的流程圖122,它繪制了從因特網(wǎng)上下載應(yīng)用程序的方法概況。流程圖122以操作124開始,在操作124中訪問提供應(yīng)用程序選項(xiàng)的站點(diǎn)。正如在前面所提到的一樣,應(yīng)用程序和其選項(xiàng)可以是任何類型的應(yīng)用,它可由一個(gè)或者多個(gè)處理實(shí)體來執(zhí)行。在連接個(gè)人電腦的打印機(jī)的例子中,應(yīng)用可以包含用于創(chuàng)建賀卡、請(qǐng)柬、圖書封面、圖片模板、名片、禮品包裝紙以及禮品盒等的功能。方法進(jìn)入到操作126,其中目錄類別選自選項(xiàng)列表。這里,用戶從操作124選擇了一個(gè)上面提到的應(yīng)用并且目錄類別列表也顯示給用戶。例如,用戶可以選擇創(chuàng)建賀卡,其與用于賀卡的目錄列表一起顯示給用戶。當(dāng)然,任何數(shù)目適合賀卡的圖象在這里都能夠顯示,例如花的排列圖案、印花以及電影明星的照片等。下一步,在操作128,給出了所選目錄類別的圖象選項(xiàng)。在一種實(shí)施方案中,圖象存儲(chǔ)在數(shù)據(jù)庫中。下一步,方法進(jìn)入到操作130,此處記錄所選圖象的標(biāo)志。這里,所存儲(chǔ)圖象用于以后Java的應(yīng)用。繼續(xù)描述圖2,在操作132中收集打印機(jī)和紙的信息。在第一種實(shí)施方案中收集打印機(jī)型號(hào)、紙張尺寸、頁邊距信息等。下一步,在操作134中,下載引導(dǎo)加載器。這里,網(wǎng)絡(luò)瀏覽器下載和安裝.cab文件,用于加載Java應(yīng)用程序和與該Java應(yīng)用程序關(guān)聯(lián)的各種模塊。方法進(jìn)入操作136,此處給用戶顯示了安全選項(xiàng)。在一種實(shí)施方案中,如果用戶拒絕安全選項(xiàng),那么方法就會(huì)結(jié)束。如果用戶接受了安全選項(xiàng),那么方法就進(jìn)入到操作138,網(wǎng)絡(luò)瀏覽器在此處解壓縮并安裝引導(dǎo)加載器即,.cab文件。下一步,在操作140中,執(zhí)行引導(dǎo)加載器。在一種實(shí)施方案中,引導(dǎo)加載器采用ActiveX控件的形式。接著,方法進(jìn)入操作142,此處引導(dǎo)加載器啟動(dòng)Java加載器。在一種實(shí)施方案中,Java加載器包含于.cab文件中。在下面更詳細(xì)的解釋中,Java加載器啟用所需要應(yīng)用程序的高效迅速的下載,而不論用戶因特網(wǎng)連接的速度是否相對(duì)較慢。也就是說,應(yīng)用程序?qū)⒘⒓纯梢允褂?,而不論一個(gè)任務(wù)需要的所有組件是否已全部被下載。圖3所示為流程圖144,繪制了按照本發(fā)明的一種實(shí)施方案的一種高層方法,其中Java加載器下載和安裝應(yīng)用及其組件。方法從操作146啟動(dòng),此處下載操作124的應(yīng)用程序所用的模塊列表。在一種實(shí)施方案中,模塊列表包括模塊名和模塊的版本信息。模塊列表的例子在圖4中展示并且其在下面會(huì)有更詳細(xì)的解釋。移到圖4,塊圖158圖示了按照本發(fā)明的一種實(shí)施方案的在圖3操作146中所下載的模塊列表。應(yīng)當(dāng)理解的是,在塊圖158中所示的模塊列表僅是數(shù)個(gè)模塊的說明,因此,是否可以存在任意數(shù)目的模塊取決于軟件的應(yīng)用程序及其用途。回想前面所述的,應(yīng)用程序160,核心模塊以及多個(gè)非核心模塊均被展示了。這里,所展示的是核心模塊版本1即162已經(jīng)被核心模塊版本2即164替換的情況。因此,在圖3的操作146中所下載的模塊列表僅僅包括最近版本的核心模塊,即一種實(shí)施方案中的版本2即164。應(yīng)當(dāng)理解的是,核心模塊版本1也被顯示,這樣做僅是為了說明問題。圖4的列表進(jìn)一步包括模塊1-5,由塊166-174表示。在本發(fā)明的一種實(shí)施方案中,應(yīng)用程序所用的模塊列表和本地系統(tǒng)中的模塊相比較,以確定系統(tǒng)需要的哪些模塊將被下載。返回到圖3,方法進(jìn)入操作148,此處Java加載器將審查列表上的每個(gè)模塊以驗(yàn)證模塊是否在本地系統(tǒng)中。例如,圖4的每個(gè)模塊,即模塊164-174,要被檢查以確定它們是否已經(jīng)存在于本地系統(tǒng)。下一步,在操作150中,任何被操作148識(shí)別的老版本模塊均要被卸載。例如,如果本地系統(tǒng)的核心版本1即162是從以前所用的應(yīng)用程序加載的,那么它會(huì)在這里被卸載。此外,如果在本地系統(tǒng)上有任何更老版本的非核心模塊,那么它們將被卸載。在一種實(shí)施方案中,如果更老版本的非核心模塊是一個(gè)共享模塊,那么非核心模塊將不會(huì)被卸載。下一步,方法進(jìn)入到判定操作152,此處要確定的是最新版本的核心模塊是否在系統(tǒng)中。如果最新版本的核心模塊不在系統(tǒng)中,那么最新版本的核心模塊將在操作154下載并安裝。在本發(fā)明的一種實(shí)施方案中,核心模塊包括含有入口點(diǎn)的類。在本發(fā)明的另一種實(shí)施方案中,含有入口點(diǎn)的類被Java加載器所請(qǐng)求以啟動(dòng)核心模塊的下載。如果最新版本的核心模塊在本地系統(tǒng)中,那么方法就進(jìn)入到操作156,此處啟動(dòng)應(yīng)用程序。圖5所示為按照本發(fā)明的一種實(shí)施方案的流程圖176,它展示了一種方法,在需要的時(shí)候,應(yīng)用程序正在運(yùn)行的同時(shí),它下載和安裝模塊。流程圖176以操作178開始,此處應(yīng)用程序正在本地系統(tǒng)中運(yùn)行。應(yīng)當(dāng)理解的是,當(dāng)用戶正在運(yùn)行應(yīng)用程序并使用各種功能的時(shí)候,除了核心模塊之外,最終會(huì)需要某個(gè)模塊。按照打印機(jī)的例子,沒有包含于核心模塊的類可能是需要的以進(jìn)行某些操作例如,打印,編輯,安排格式等。下一步,方法進(jìn)入操作180,此處識(shí)別包含需要的類的模塊。方法移到操作182,此處下載包含需要的類的模塊并將其安裝到本地系統(tǒng)中。例如,參考圖4,如果模塊4即172對(duì)于應(yīng)用程序的具體特征是所必須的,那么模塊4即172將會(huì)被下載和安裝。方法進(jìn)入操作184,此處執(zhí)行由所下載的模塊的類提供的特征功能。在操作184之后,方法返回到操作178,應(yīng)用程序從那繼續(xù)運(yùn)行。當(dāng)然,在一種實(shí)施方案中,應(yīng)用程序的組件大體上均是在后臺(tái)運(yùn)行的。用戶也能夠按照自己的意愿隨時(shí)停止或者退出應(yīng)用程序。圖6所示為按照本發(fā)明的一種實(shí)施方案的流程圖186,它更詳細(xì)地描述了應(yīng)用程序的模塊的下載。流程圖186以操作188開始,此處接收來自Java虛擬機(jī)(JVM)的請(qǐng)求。例如,當(dāng)首次啟動(dòng)應(yīng)用程序時(shí),類加載器將會(huì)收到來自Java虛擬機(jī)(JVM)的請(qǐng)求以運(yùn)行一種實(shí)施方案中的主類。主類包含于本發(fā)明另一種實(shí)施方案中的核心模塊。應(yīng)當(dāng)理解的是,Java虛擬機(jī)僅關(guān)心類而與模塊無關(guān),而類加載器將類映像到模塊中。下一步,方法進(jìn)入操作190,此處找到了包含類的模塊。操作190參照?qǐng)D7將會(huì)有更詳細(xì)的解釋。下一步,在判定操作192中,要確定的是,在操作190中所找到的模塊是否已安裝在本地系統(tǒng)中了。如果模塊不在本地系統(tǒng)中,那么在操作194中下載和安裝模塊。如果模塊已安裝在本地系統(tǒng)中,那么方法就從操作192進(jìn)入到操作196,此處從模塊中獲取所需要的類對(duì)象。一旦用圖6的方法從模塊中獲取了類對(duì)象,那么方法返回到操作188。在一種實(shí)施方案中,類對(duì)象在此處被回送給Java虛擬機(jī)。應(yīng)當(dāng)理解的是,當(dāng)應(yīng)用程序首次加載到本地系統(tǒng)的時(shí)候,在所有內(nèi)部相關(guān)的類加載完之前,包含入口點(diǎn)的類會(huì)請(qǐng)求下一個(gè)類,并依此類推。在一種實(shí)施方案中,包含入口點(diǎn)的主類被映像到核心模塊中。作為一個(gè)說明性的例子,類A包含入口點(diǎn)并且當(dāng)啟動(dòng)時(shí),它首先被Java虛擬機(jī)請(qǐng)求。在組成核心模塊的所有內(nèi)部相關(guān)的類加載完之前,類A將請(qǐng)求類B,并依此類推。上述說明性的例子也可應(yīng)用到其它參與了特征功能的非核心模塊。一旦安裝了包含核心模塊的類,那么用戶就可以選擇執(zhí)行需要特征功能的任務(wù)。在打印機(jī)及其應(yīng)用的例子中,用戶或許想要旋轉(zhuǎn)或者打印圖形。一旦激活了旋轉(zhuǎn)或者打印按鈕,那么代碼將會(huì)向Java虛擬機(jī)請(qǐng)求能實(shí)現(xiàn)特征功能的類。因此,Java虛擬機(jī)將會(huì)請(qǐng)求用于特征功能所需要的類并且操作188-196將會(huì)重復(fù)以獲取所需要的類和所有內(nèi)部相關(guān)的類。參照?qǐng)D8-10,將會(huì)有更詳細(xì)細(xì)節(jié)的解釋,在能實(shí)現(xiàn)特征功能的模塊被另一種實(shí)施方案中的用戶請(qǐng)求之前,它也可以在后臺(tái)下載。流程圖190以操作198開始,此處Java虛擬機(jī)請(qǐng)求類加載器以加載類。方法進(jìn)入操作200,此處搜索已安裝的模塊以獲取被請(qǐng)求的類。對(duì)本領(lǐng)域諳熟的人應(yīng)當(dāng)理解的是,各種不同的技術(shù)都可用來搜索數(shù)據(jù)結(jié)構(gòu)以獲取被請(qǐng)求的類。下一步,方法進(jìn)入判定操作202,以確定是否已經(jīng)找到所請(qǐng)求的類。如果發(fā)現(xiàn)類被安裝在本地系統(tǒng)的模塊中,那么類就被回送給操作204中的Java虛擬機(jī)。如果沒有找到該類,那么圖7的方法就進(jìn)入到206,此處要查詢服務(wù)器以確定哪個(gè)模塊包含被請(qǐng)求的類。在第一種實(shí)施方案中,每個(gè)類和服務(wù)器中的一個(gè)模塊關(guān)聯(lián),即服務(wù)器含有和模塊的類相匹配的數(shù)據(jù)結(jié)構(gòu)。因此,在本發(fā)明的一種實(shí)施方案中,包含被請(qǐng)求的類的模塊在此處被識(shí)別。方法進(jìn)入到操作208,在此處下載包含所請(qǐng)求的類的模塊。在一種實(shí)施方案中,模塊是以一個(gè)內(nèi)部相關(guān)類接下一個(gè)的方式進(jìn)行下載的,如圖6所論述的一樣。在再一種實(shí)施方案中,已下載模塊也被安裝。如下的表1包括按照本發(fā)明的一種實(shí)施方案的安裝模塊的說明性的代碼。當(dāng)然,代碼可以采用任何形式,只要能夠完成安裝函數(shù)就可以。表1<prelisting-type="program-listing">*copyright@1995~2001EPSONPaloAlto實(shí)驗(yàn)室。版權(quán)所有。//加載包含于zf.中的包。publicstaticvoidinstallPackage(FilezFile)throwsIOException{ZipFilezf=newZipFile(zFile);try{ Archiveinfoai=newArchiveinfo(zf) //保存資源文件 for(Enumeratione=zf.entries();e.hasMoreElements();){ ZipEntryze=(ZipEntry)e.nextElement(); StringzipName=ze.getName(); if(!zipName.endsWith(″.class″)){ ze=zfgetEntry(zipName); zipName=zipName.replace(′\\′,′/′); InputStreamis=zf.getlnputStream(ze); if(ai.isSharedModule()){ saveResource(SmartLauncher.getSharedResourceDir(),zipName,is); }else{ saveResource(SmartLauncher.GetAppResourceDir(),zipName,is);} } //查找系統(tǒng)類文件并且將它們安裝到共享類目錄。 for(Enumeratione=ai.getSystemClasses().elements();e.hasMoreElements();){ StringsysClass=(String)e.nextElement();<dpn="d11"/> ZipEntryze=getzipEntryFromClassName(zf,sysClass); if(ze==null){ thrownewIOException("Cannotfindsystemclass″+sysClass); } InputStreamis=zf.etlnputStream(ze); saveClass(SmartLauncher.getSharedSystemClassDir(),sysClass,is); } //查找系統(tǒng)類文件并且將它們安裝到共享類目錄。 for(Enumeratione=ai.getSystemResources().elements();e.hasMoreElements();){ StringsysResource=(Sring)e.nextElement(); ZipEntryze=zf.getEntry(sysResource); if(ze==null) thrownewIOException("Cannotfindsystemclass″+sysResource); } InputStreamis=zf.getlnputStream(ze); SaveResource(SmartLauncher.getSharedSystemClassDir(),sysResource,is); }//調(diào)用安裝函數(shù) if(ai.getMetaClass()!=null) try{ InstallClassLoaderinstailLoader=newInstaliClassLoader(zf); ClassclsMeta=installLoader.loadClass(ai.getMetaClass(),true); Objectmc=clsMeta.newlnstance(); Class[]clsParams={java.util.Hashtable.class}; Methodm=clsMeta.getMethod(″install″,clsParams); Object[]objParams={createInstallProperties(getSmartClassLoader(),zf); //調(diào)用安裝函數(shù) m.invoke(mc,objParams); }catch(Exceptione); //不能夠調(diào)用元類安裝?! ystem.out.println(″Installfunctionignoredinclass″+ai.getMetaClass())<dpn="d12"/> } } }finally{ zf.close();}</pre>圖8所示為按照本發(fā)明的一種實(shí)施例的流程圖210,表示一種方法,一旦主應(yīng)用程序已啟動(dòng),它用于在多線程環(huán)境中執(zhí)行后臺(tái)的下載。應(yīng)當(dāng)理解的是,流程圖210的方法能夠在多線程環(huán)境中與參照?qǐng)D7所描述的方法一起作業(yè)。流程圖210以操作212開始,此處訪問要下載的模塊列表。在一種實(shí)施方案中,模塊列表包括優(yōu)先權(quán)列表,它表示模塊在后臺(tái)環(huán)境被下載的順序。優(yōu)先權(quán)列表的例子將參照?qǐng)D9在下面描述。圖9所示為按照本發(fā)明的每一種實(shí)施方案的對(duì)應(yīng)塊圖224,它表示要下載的用于應(yīng)用程序的各種模塊的優(yōu)先權(quán)列表。如塊圖224中所展示的,包含應(yīng)用程序的每個(gè)模塊被賦予了一個(gè)優(yōu)先權(quán)。例如,核心模塊(Mc)226被賦予優(yōu)先權(quán)1,是最高的優(yōu)先權(quán)。核心模塊必須被首先下載,因此,Mc必須接收最高優(yōu)先權(quán)。剩余的模塊M1-M5,即228與優(yōu)先權(quán)2-6分別對(duì)應(yīng)。在一種實(shí)施方案中,優(yōu)先權(quán)列表存放于聯(lián)網(wǎng)資源服務(wù)器中(例如,它包含了應(yīng)用程序和其模塊)。如下面更進(jìn)一步的解釋,在本地系統(tǒng)可以從先前運(yùn)行的應(yīng)用程序中安裝過一些模塊。在這種情況下,下載管理器將以所需的下載模塊列表初始化,從而要確保下載管理器將不會(huì)下載那些已經(jīng)安裝的模塊。模塊列表也可以是圖4的模塊列表,其優(yōu)先權(quán)包含于本發(fā)明的一種實(shí)施方案中。返回到圖8,一旦在操作212中訪問了優(yōu)先權(quán)列表,則方法就進(jìn)入判定操作214中,在此要進(jìn)行檢查以確定所有模塊是否已下載到了本地系統(tǒng)中。這里,參照?qǐng)D3、4和9所論述的模塊列表被檢查以確定哪個(gè)模塊需要被下載(如果有的話)。如果列表中的所有模塊已安裝在本地系統(tǒng)中,那么方法就在操作216結(jié)束。如果所有模塊還沒有被完全下載,那么方法就進(jìn)入操作218,在此獲取要下載的模塊名。例如,如果Mc和M2已經(jīng)被安裝到本地系統(tǒng)中,那么將在操作218獲取模塊名M1,因?yàn)镸1在剩余的模塊中具有最高的優(yōu)先權(quán)。與操作218中所獲取的模塊名對(duì)應(yīng)的模塊在操作220下載。下一步,所下載的模塊在操作222安裝。應(yīng)當(dāng)理解的是,按照本發(fā)明的一種實(shí)施方案安裝模塊用的例子代碼,它在表1中已展示,可以在操作222執(zhí)行。包括操作214-222的循環(huán)將會(huì)自行重復(fù)直到所有模塊均被下載。圖10所示為按照本發(fā)明的一種實(shí)施方案的流程圖230,它展示了圖7的操作208的更詳細(xì)的描述,圖中模塊的下載在多線程環(huán)境中根據(jù)下載管理器邏輯進(jìn)行。流程圖208以操作232開始,此處向下載管理器請(qǐng)求要下載的模塊。應(yīng)當(dāng)理解的是,類加載器在此有控件。方法進(jìn)入判定操作234,在此要確定的是所請(qǐng)求的模塊是否正在被下載管理器下載的模塊。如果所請(qǐng)求的模塊正在被下載管理器下載,那么方法移到操作236,在此,方法等待到下載管理器完成模塊下載為止。應(yīng)當(dāng)理解的是,諳熟本領(lǐng)域的技術(shù)人員所熟知的常用暫停技術(shù)在此操作中能夠使用。另一方面,如果在圖10的判定操作234中,所請(qǐng)求的模塊并不是正被下載管理器下載的模塊,那么方法就進(jìn)入操作240,在此掛起當(dāng)前的下載。例如,某用戶打算旋轉(zhuǎn)圖象,則要用到實(shí)現(xiàn)特征功能的模塊4(M4)。然而,下載管理器正在下載的模塊卻是模塊3(M3),因此M3的下載就在操作240中被掛起,從而就可下載M4而避免與M3競(jìng)爭(zhēng)帶寬。在本發(fā)明的一種實(shí)施方案中,僅當(dāng)用戶中斷了由優(yōu)先權(quán)列表所管理的模塊的順序下載時(shí),包含這個(gè)判定操作的下載管理器的邏輯才啟動(dòng)。方法進(jìn)入操作242,在此下載請(qǐng)求的模塊。繼續(xù)上面的例子,隨著M3的掛起,M4會(huì)在此下載。在一種實(shí)施方案中,下載過M3的代碼的另一個(gè)實(shí)例用于下載M4。在操作244中,安裝被請(qǐng)求的模塊。方法移到操作246,在此被掛起的下載線程就繼續(xù)進(jìn)行。參照上述例子,當(dāng)一完成M4的安裝,M3的下載就繼續(xù)進(jìn)行。下一步,在操作248中,方法進(jìn)入圖8的操作220,這里模塊被下載。如下的表2包括按照本發(fā)明的一種實(shí)施方案的類加載器的說明性的代碼對(duì)應(yīng)。當(dāng)然,代碼可以采用任何形式,只要加載函數(shù)能夠?qū)崿F(xiàn)就可以。表2<prelisting-type="program-listing">/*“*$WorkfileSmartClassLoaderjava$“*”*copyright@1995~2001EPSONPaloAlto實(shí)驗(yàn)室。版權(quán)所有。*EPSONResearchandDevelopment,Inc。SeikoEPSON的子公司。*版權(quán)所有。**/packageepal.compman;importjava.util.*;importjava.util.zip.*;importjava.io.*;importjava.net.*;importjava.lang.*;importjava.lang.reflect.*; /** *類的說明從這里開始?! ? */ publicclassSmartClassLoaderextendsjava.lang.ClassLoader{ //從類名映射到被加載的類對(duì)象?! rivateHashtablem_classCache=newHashtable(); //從包名映射到歸檔文件?! rivateHashtablem_packageMap=newHashtable(); //從類名映射到歸檔文件。<dpn="d15"/>privateHashtablem_classMap=newHashtable();//從資源名映射到歸檔文件。 privateHashtablem_resourceMap=newHashtable();publicSmartClassLoader()throwsIOException{super();}publicURLgetResource(Stringname){URLurl=getSystemResource(name);if(url!=null) returnuri; StringszResourceFile=name.replace(‘/’,F(xiàn)ile.separatorChar); Filef=newFile(SmartLauncher.getAppResourceDir(),szResourceFile); try{ returnnewURL(″file″,″localhos",f.GetAbsolutcPath()); }catch(Exceptione){ returnnull; }}publicInputStreamgetResourceAsStream(Stringname) InputStreamis=getSystemResourceAsStream(name); if(is?。絥ull) returnis; StringszResourceFile=name.replace(‘/’,F(xiàn)ile.separatorChar); Filef=newFile(SmartLauncher.getAppResourceDir(),szResourceFile); try{ returnnewFileInputStream(f);<dpn="d16"/>}catch(Exceptione){ returnnull;} }protectedClassloadClass(Stringname,booleanresolve)throwsClassNotFoundException{//System.out.println(name); if(name.indexOf("PIMjpegNative″)?。?1){inti=10;} if(name.indexOf("JopsDecoder″)?。?1){inti=10; } //檢查類在前面是否已經(jīng)加載?! lassc=(Class)m_classCache.get(name); if(c?。絥ull){ if(resolve){ resolveClass(c); } returnc; } ArchiveInfoai=(ArchiveInfo)m_classMap.get(name); if(ai!=null){ //檢查這里的Archiveinfo的版本?! ?/Hack假設(shè)總是ok。 //類能夠從zip文件中被加載?! ?/現(xiàn)在檢查類是否應(yīng)當(dāng)從系統(tǒng)加載。<dpn="d17"/>if(ai.getSystemClasses().indexOf(name)?。?1){//這是一個(gè)應(yīng)當(dāng)由系統(tǒng)類加載器加載的類。c=findSystemClass(name);}else//從zip文件加載。ZipEntryze=SmartLauncher.getZipEntryFromClassName(ai.getZipFile),name);try{ c=loadClassFromZipEntry(ai.getZipFile(),ze,name); }catch(IOExceptione){ thrownewClassNotFounException(″Cannotfindclass″+name); } } }else{//類不能夠從zip文件加載。Try{ //嘗試從系統(tǒng)加載?! =findSystemClass(name); }catch(Exceptione) //類既不能從zip文件也不能從系統(tǒng)加載?! ?/這個(gè)類可能是 //1.一個(gè)沒有查找到的被請(qǐng)求的resourcebundle類?! ?/2.一個(gè)不應(yīng)該下載或者安裝的類?! f(isResourceBundleClass(name)){ //VM(虛擬機(jī))正在請(qǐng)求一個(gè)packagebundle類?! hrownewClassNotFoundException(); } //該類從系統(tǒng)不能找到。嘗試去下載該類并安裝它。 try{ Filef=SmartLauncher.getDownloadManager().getZipFile(name); SmartLauncher.getSmartClassLoader().loadPackage(f);}catch(Exceptionioe) thrownewClassNotFoundException(ioe.getMessage());<dpn="d18"/> } ai=(Archiveinfo)m_classMap.get(name); if(ai==null) //我們應(yīng)該在此處查找該類?! ?thrownewClassNotFoundException(); }elsetry{ if(ai.getSystemClasses().indexOf(name)?。?1){ //這是一個(gè)應(yīng)該由系統(tǒng)類加載器加載的類?! =findSystemClass(name); }else{ //從zip文件加載?! ipEntryze=SmartLauncher.getZipEntryFromClassName(ai.getZipflle(),name); c=loadClassFromZipEntry(ai.getZipFile(),ze,name); } }catch(Exceptionex){ thrownewClassNotFoundException(ex.GetMessage()); } } }} if(resolve){ resolveClass(c); } m_classCache.put(name,c); returnc; } publicvoidloadPackages()throwsIOException{ Filedir=SmartLauncher.getAppDir();<dpn="d19"/>String[]zfname=dir.list(); if(zfname?。絥ull) for(inti=0;i<zfname.length;i++){ if(zfname[i].endsWith(″.zip″)){ try{ loadPackage(newFile(dir,zfname[i])); }catch(ZipExceptionze){ Filef=newFile(dir,zfname[i]); f.delete(); } } } } dir=SmartLauncher.getSharedDir(); zfname=dir.list(); if(zfname?。絥ull) for(inti=0;i<zfname.length;i++){ if(zfname[i].endsWith(″.zip″)){ try{ loadpackage(newFile(dir,zfname[i])); }catch(ZipExceptionze){ Filef=newFile(dir,zfname[i]); f.delete(); } } } } } publicvoidloadpackage(fllefZipFile)throwsIOException{ ZipFilezf=newZipFile(fZipFile);<dpn="d20"/> Archiveinfoai=newArchivelnfo(zf);//加載類。for(Enumeratione=zf.entries();e.hasMoreElements();){ ZipEntryze=(ZipEntry)e.nextElement(); StringzipName=ze.getName(); if(zipName.endsWith(″.class″)){ StringclassName=getClassNameFromZipName(zipName); m_classMap.put(className,ai); m_packageMap.put(getPackageName(className),ai); }else{ zipName=zipName.replace(‘\\’,’/’); m_resourceMap.put(zipName,ai); } }} //加載包含于ze的類。privateClassloadClassFromZipEntry(ZipFilezf,ZipEntryze,StringclassName)throwsIOException{ StringszZipName=ze.getName(); InputStreamis=zf.getInputStream(ze); ByteArrayOutputStreambaos=newByteArrayOutputStream(); byte[]tempBuf=newbyte; intbytesRead=0; try{do{ bytesRead=is.read(tempBuf,0,1024); if(bytesRead>0){ baos.write(tempBuf,0,bytesRead); }<dpn="d21"/> }while(bytesRead>=0); }catch(EOFExceptioneofex){ //這是精細(xì)搜索?! is.close(); byte[]clsData=baostoByteArray(); returndefineClass(className,clsData,0,clsData.length); } privateStringgetClassNameFromZipName(StringzipName) intindex=zipName.lastlndexOf(″.class″);if(index<=0) returnnull; StringclassName=zipName.replace(‘/′,′.′); className=className.replace(‘\\’,′.′); returnclassName.gubstring(0,index);}/** 回送類的包名。 */privateStringgetPackageName(StringclassName){ intindex=className.LastlndexOf(“.”); if(index<=0) return“”; returnclassName.substring(0,index); }privateStringgetBaseclassName(Stringname){intiBegin=Math.max(0,name.lastlndexOf(″.″));intiEnd=name.indexOf(″_″,iBegin);if(iEnd==-1){<dpn="d22"/>returnname; } returnname.substring(0,iEnd); }privatebooleanisResourceBundleClass(Stringname)Stringbase=getBaseclassName(name);base=base.replace(‘.’,F(xiàn)ile.separatorChar); Filef=newFile(SmartLauncher.getAppResourceDir(),base+″.properties″);if(f.exists()) returntrue; returnfalse; }}</pre>盡管上面所描述的發(fā)明是在通用的含義上說明了在與個(gè)人計(jì)算機(jī)相結(jié)合的操作系統(tǒng)上執(zhí)行的應(yīng)用程序,但是應(yīng)當(dāng)理解的是,本發(fā)明可以用其它例程、程序、組件以及數(shù)據(jù)結(jié)構(gòu)等來實(shí)現(xiàn),它們能執(zhí)行特定的任務(wù)或者實(shí)現(xiàn)特定的抽象數(shù)據(jù)類型。進(jìn)一步地講,本發(fā)明可以用其它計(jì)算機(jī)系統(tǒng)裝置來實(shí)現(xiàn),其中包括手持式設(shè)備、微處理器系統(tǒng)、基于微處理器的或者可編程的消費(fèi)類電子設(shè)備,微型計(jì)算機(jī)以及大型計(jì)算機(jī)等。本發(fā)明也可以在分布式計(jì)算環(huán)境中被實(shí)現(xiàn),在這種環(huán)境中,任務(wù)的執(zhí)行是由鏈接到通訊網(wǎng)絡(luò)的遠(yuǎn)程處理設(shè)備來實(shí)現(xiàn)的?;叵胍幌律厦娴膶?shí)施方案,應(yīng)當(dāng)理解的是,本發(fā)明可以使用各種計(jì)算機(jī)實(shí)現(xiàn)的操作,這些操作涉及到存儲(chǔ)于計(jì)算機(jī)系統(tǒng)中的數(shù)據(jù)。這些操作需要用到各種物理量的物理處理。通常情況下,盡管并不是必須的,這些量采用的是電或磁信號(hào),它們能夠被存儲(chǔ)、轉(zhuǎn)移、合并、比較以及進(jìn)行其它方面的處理。更進(jìn)一步地講,所執(zhí)行的操作經(jīng)常作為術(shù)語被提到,例如產(chǎn)生、識(shí)別、確定或者比較等。這里所描述的任何操作,作為本發(fā)明的一部分,都是有用的機(jī)器操作。本發(fā)明也涉及到一種用于執(zhí)行這些操作的設(shè)備或者裝置。裝置可以是為完成所需而專門構(gòu)造的,或者可以是通用計(jì)算機(jī),這種計(jì)算機(jī)通過存儲(chǔ)于計(jì)算機(jī)的計(jì)算機(jī)程序能夠有選擇地激活或者配置。具體地講,各種通用機(jī)器可以和計(jì)算機(jī)程序一起使用,其中計(jì)算機(jī)程序是根據(jù)這里所講述的內(nèi)容編寫的,或者它可以是一種更便于構(gòu)造成執(zhí)行所需操作的更專門的裝置。本發(fā)明也能夠體現(xiàn)為存儲(chǔ)在計(jì)算機(jī)可讀媒體中的計(jì)算機(jī)可讀代碼。計(jì)算機(jī)可讀媒體是任何類型的數(shù)據(jù)存儲(chǔ)設(shè)備,它們能夠存儲(chǔ)數(shù)據(jù)并且以后這些數(shù)據(jù)還能夠被計(jì)算機(jī)系統(tǒng)讀取。計(jì)算機(jī)可讀媒體的例子包括硬盤、網(wǎng)絡(luò)直連存儲(chǔ)(NAS)、只讀存儲(chǔ)器、隨機(jī)訪問存儲(chǔ)器、CD-ROM、CD-R、CD-RW、磁帶以及其它光學(xué)及非光學(xué)型的數(shù)據(jù)存儲(chǔ)設(shè)備。計(jì)算機(jī)可讀媒體也能夠發(fā)布到鏈接了計(jì)算機(jī)系統(tǒng)的網(wǎng)絡(luò)上從而能夠使計(jì)算機(jī)可讀代碼以分布式方式被存儲(chǔ)和執(zhí)行。盡管為了使發(fā)明能清楚地被理解,前述發(fā)明描述得相當(dāng)詳細(xì),但是顯而易見的是,在所附的權(quán)利要求范圍之內(nèi)的某種程度的改變和修改方案是可以實(shí)現(xiàn)的。因此,本實(shí)施方案將被認(rèn)為是說明性的而不是限制性的,并且本發(fā)明將不會(huì)被限制在這里給出的細(xì)節(jié)之內(nèi),而是可以在所附的權(quán)利要求及其等同的范圍內(nèi)被修改。權(quán)利要求1.一種計(jì)算機(jī)實(shí)現(xiàn)的方法,使用通用計(jì)算機(jī)來執(zhí)行,該計(jì)算機(jī)實(shí)現(xiàn)的方法能夠?qū)⒖蓤?zhí)行程序從聯(lián)網(wǎng)存儲(chǔ)器中下載到通用計(jì)算機(jī),所述方法包括下載核心模塊,該核心模塊包括運(yùn)行可執(zhí)行程序的引擎所必須的類;安裝核心模塊,安裝的核心模塊提供即時(shí)的用戶功能,安裝的核心模塊包括這樣的代碼,該模塊代碼用于請(qǐng)求與核心模塊沒有關(guān)聯(lián)的類;為被請(qǐng)求的類搜索可執(zhí)行程序的非核心模塊;以及在執(zhí)行程序提供用戶功能的同時(shí)給通用計(jì)算機(jī)下載包含被請(qǐng)求類的非核心模塊。2.權(quán)利要求1敘述的方法,其中非核心模塊包含于通用計(jì)算機(jī)和聯(lián)網(wǎng)的源服務(wù)器之一的存儲(chǔ)設(shè)備中。3.權(quán)利要求1敘述的方法,其中核心模塊從命令行接收指令。4.權(quán)利要求1敘述的方法,其中核心模塊的安裝包括,下載和安裝圖形用戶界面模塊,以用于提供用戶程序的選項(xiàng)。5.權(quán)利要求1敘述的方法,其中用于安裝的核心模塊的代碼包括用于預(yù)測(cè)將要被請(qǐng)求的非核心模塊的代碼,這種預(yù)測(cè)是根據(jù)用戶與可執(zhí)行程序間的交互而進(jìn)行的。6.一種用于在多線程環(huán)境中下載應(yīng)用程序的模塊的方法,所述下載發(fā)生在運(yùn)行應(yīng)用程序的核心模塊的同時(shí),核心模塊的運(yùn)行允許用戶應(yīng)用與該應(yīng)用程序的特征進(jìn)行交互,核心模塊執(zhí)行的方法包括在下載第二個(gè)模塊的同時(shí)請(qǐng)求第一個(gè)模塊;掛起第二個(gè)模塊的下載;下載第一個(gè)模塊;以及在第一個(gè)模塊下載完成之后繼續(xù)下載第二個(gè)模塊;由此,正在運(yùn)行的應(yīng)用程序能夠使用戶應(yīng)用程序和核心模塊所提供的基本功能進(jìn)行交互,并且在應(yīng)用程序正在運(yùn)行的同時(shí),一旦完成后臺(tái)的安裝,該正在運(yùn)行的應(yīng)用程序能夠使用由第一個(gè)模塊和第二個(gè)模塊中的每一個(gè)所提供的功能。7.權(quán)利要求6敘述的方法,其中后臺(tái)安裝根據(jù)優(yōu)先權(quán)列表進(jìn)行。8.權(quán)利要求6敘述的方法,其中第一和第二個(gè)模塊通過因特網(wǎng)下載。9.權(quán)利要求6敘述的方法,其中應(yīng)用程序與打印機(jī)結(jié)合在一起使用。10.權(quán)利要求6敘述的方法,其中應(yīng)用程序可以從銷售商的網(wǎng)絡(luò)站點(diǎn)訪問到。11.一種用于將模塊從分布式網(wǎng)絡(luò)上下載到通用計(jì)算機(jī)中供應(yīng)用程序使用的方法,下載的同時(shí)應(yīng)用程序正在通用計(jì)算機(jī)上運(yùn)行,所述方法包括啟用應(yīng)用程序的選擇;識(shí)別一個(gè)核心模塊以用于運(yùn)行所選擇應(yīng)用程序的引擎;下載和安裝該核心模塊;啟用與應(yīng)用程序的非核心模塊關(guān)聯(lián)的特征的選擇,以作為對(duì)與非核心模塊關(guān)聯(lián)的特征的選擇的響應(yīng),所述方法包括,確定非核心模塊是否在本地通用計(jì)算機(jī)上獲得;如果非核心模塊不可在本地獲得則從分布式網(wǎng)絡(luò)上下載非核心模塊;以及安裝非核心模塊,其中,所述確定、下載和安裝是在啟用用戶對(duì)核心模塊已安裝的特征的訪問與交互的同時(shí)執(zhí)行的。12.權(quán)利要求11敘述的方法,其中核心模塊的識(shí)別包括,確定核心模塊是否可在本地通用計(jì)算機(jī)上獲得。13.權(quán)利要求11敘述的方法,其中啟用應(yīng)用程序的選擇進(jìn)一步包括,從銷售商站點(diǎn)訪問應(yīng)用程序。14.權(quán)利要求11敘述的方法,其中所述確定、下載和安裝是由被包含在下載管理器中的邏輯啟用的。15.一種計(jì)算機(jī)實(shí)現(xiàn)的方法,用于將應(yīng)用程序安裝到通用計(jì)算機(jī)上,所述方法包括確定核心模塊是否在本地通用計(jì)算機(jī)上可用,該確定包括,如果核心模塊在本地通用計(jì)算機(jī)上可用,則確定其是否是最近的版本;根據(jù)核心模塊不可用或者核心模塊不是最近版本,所述方法進(jìn)一步包括,下載核心模塊,該核心模塊包括運(yùn)行應(yīng)用程序的引擎所必須的類;安裝核心模塊,所述安裝的核心模塊提供即時(shí)的用戶功能;預(yù)測(cè)對(duì)非核心模塊的需要;以及在應(yīng)用程序正在執(zhí)行的同時(shí),下載所預(yù)測(cè)的非核心模塊。16.權(quán)利要求15敘述的方法,其中對(duì)非核心模塊需求的預(yù)測(cè)是根據(jù)當(dāng)前用戶的選擇和用戶行為的統(tǒng)計(jì)分析之一進(jìn)行的。17.權(quán)利要求15中敘述的方法,其中預(yù)測(cè)的非核心模塊的下載是在多線程環(huán)境中執(zhí)行的。18.權(quán)利要求15中敘述的方法,其中對(duì)于核心模塊是否是最近版本的確定進(jìn)一步包括,如果本地通用計(jì)算機(jī)上可用的核心模塊不是最近版本,則卸載該核心模塊。19.一種用于將計(jì)算機(jī)程序從網(wǎng)絡(luò)下載到通用計(jì)算機(jī)上的方法,所述計(jì)算機(jī)程序被劃分為模塊,所述方法包括下載核心模塊,該核心模塊包括運(yùn)行計(jì)算機(jī)程序的引擎所必須的類;安裝核心模塊,安裝的核心模塊給出即時(shí)的用戶功能;根據(jù)優(yōu)先權(quán)列表下載非核心模塊;作為對(duì)請(qǐng)求特征功能的用戶的響應(yīng),請(qǐng)求其中的一個(gè)非核心模塊,它既沒有被下載也不是正在被下載;根據(jù)優(yōu)先權(quán)列表暫停非核心模塊的下載;啟動(dòng)其中的一個(gè)包含特征功能的非核心模塊的下載;安裝其中的一個(gè)非核心模塊;以及根據(jù)優(yōu)先權(quán)列表繼續(xù)非核心模塊的下載。20.權(quán)利要求19中敘述的方法,其中多線程環(huán)境被提供用于下載計(jì)算機(jī)程序。21.權(quán)利要求19中敘述的方法,其中優(yōu)先權(quán)列表存放于聯(lián)網(wǎng)源服務(wù)器。22.權(quán)利要求19敘述的方法,其中在計(jì)算機(jī)程序提供用戶功能時(shí)非核心模塊的下載在后臺(tái)進(jìn)行。23.權(quán)利要求19敘述的方法,其中Java加載器啟動(dòng)計(jì)算機(jī)程序的下載。24.權(quán)利要求23敘述的方法,其中引導(dǎo)加載器啟動(dòng)Java加載器。25.用于下載應(yīng)用程序的裝置,包含存儲(chǔ)單元,用于存儲(chǔ)執(zhí)行應(yīng)用程序的編碼的指令;監(jiān)視器,用于給用戶顯示應(yīng)用程序特征,應(yīng)用程序特征與應(yīng)用程序的模塊相關(guān)聯(lián),模塊包含執(zhí)行應(yīng)用程序特征的編碼指令;以及處理器,該處理器被加以配置以便處理編碼指令,其中編碼指令被加以配置以便下載和安裝應(yīng)用程序的核心模塊,核心模塊能夠運(yùn)行應(yīng)用程序的引擎并且立即允許用戶與應(yīng)用程序交互,其中作為對(duì)用戶選擇的與非核心模塊關(guān)聯(lián)的其中的一個(gè)應(yīng)用程序特征的響應(yīng),要下載、安裝和啟用非核心模塊以便以核心模塊所提供的功能一起進(jìn)行立即的功能性使用。26.權(quán)利要求25敘述的裝置,其中編碼指令包括優(yōu)先權(quán)列表,以用于應(yīng)用程序模塊的下載。27.權(quán)利要求25敘述的裝置,其中應(yīng)用程序通過因特網(wǎng)下載。28.權(quán)利要求25敘述的裝置,其中模塊的下載是根據(jù)在用戶與應(yīng)用程序的交互基礎(chǔ)上的預(yù)測(cè)而進(jìn)行的。29.權(quán)利要求25敘述的裝置,其中應(yīng)用程序是和打印機(jī)一起使用的。30.具有用于從網(wǎng)絡(luò)上下載可執(zhí)行程序的程序指令的計(jì)算機(jī)可讀媒體,包括程序指令,用于下載核心模塊,該核心模塊包括運(yùn)行可執(zhí)行程序的引擎所必須的類;程序指令,用于安裝核心模塊,該安裝的核心模塊還包括程序指令以用于,請(qǐng)求與核心模塊沒有關(guān)聯(lián)的類;搜索非核心模塊以獲取被請(qǐng)求的類;以及在可執(zhí)行程序提供用戶功能的同時(shí),下載包含被請(qǐng)求的類的非核心模塊。31.權(quán)利要求30敘述的計(jì)算機(jī)可讀媒體,其中安裝的核心模塊還包括程序指令以用于,預(yù)測(cè)與將被請(qǐng)求的核心模塊沒有關(guān)聯(lián)的類,該預(yù)測(cè)是根據(jù)用戶與可執(zhí)行程序間的交互而進(jìn)行的。32.權(quán)利要求31敘述的計(jì)算機(jī)可讀媒體,該預(yù)測(cè)是根據(jù)所觀察的用戶行為的統(tǒng)計(jì)分析進(jìn)行的。33.權(quán)利要求30敘述的計(jì)算機(jī)可讀媒體,其中用于下載非核心模塊的程序指令在多線程環(huán)境中執(zhí)行。34.權(quán)利要求30敘述的計(jì)算機(jī)可讀媒體,其中可執(zhí)行程序包括用于確定下載程序模塊的順序的優(yōu)先權(quán)列表。全文摘要本發(fā)明給出了用于通過分布式網(wǎng)絡(luò)下載應(yīng)用程序的方法和裝置。一個(gè)示例方法包括計(jì)算機(jī)實(shí)現(xiàn)的方法,這種方法由通用計(jì)算機(jī)來執(zhí)行,此處由計(jì)算機(jī)實(shí)現(xiàn)的方法能夠?qū)⒖蓤?zhí)行程序從聯(lián)網(wǎng)存儲(chǔ)器中下載到通用計(jì)算機(jī)。該方法以核心模塊的下載開始,此處核心模塊包括運(yùn)行可執(zhí)行程序的引擎所必須的類。然后,安裝核心模塊,這將進(jìn)而提供即時(shí)的用戶功能。安裝的核心模塊包括這樣的代碼該代碼用于請(qǐng)求與核心模塊沒有關(guān)聯(lián)的類;搜索可執(zhí)行程序的非核心模塊以獲取被請(qǐng)求的類;以及在可執(zhí)行程序提供用戶功能的同時(shí),將包含被請(qǐng)求的類的非核心模塊下載到通用計(jì)算機(jī)。文檔編號(hào)G06F9/54GK1416057SQ02148150公開日2003年5月7日申請(qǐng)日期2002年10月31日優(yōu)先權(quán)日2001年10月31日發(fā)明者李家欣,S·內(nèi)爾森,B·陳申請(qǐng)人:精工愛普生株式會(huì)社