【轉載】Java RMI codebase 小議

原文:https://blog.csdn.net/bigtree_3721/article/details/50614289

codebase問題其實是一個怎樣從網絡上下載類的問題,我想不只是在Jini和RMI程序開發中要用到。只要需要從網絡上下載類,就要涉及到codebase問題。例如applet等。但是因爲我對applet程序不是很熟悉,所以我就只談Jini和RMI,但我想codebase問題應該是通用的。

毫無疑問,對於大多數Jini和RMI開發新手來說,如何使用codebase是比較輕易令人迷惑的一件事。(我的一位師妹就很痛苦過,而且懷疑這個是不是sun的一個騙局:P)下面我就講講codebase要注重的幾個方面,也就是容 易出問題的地方。

一、爲什麼需要codebase

當我們用一個對象作爲遠程方法調用的參數時,對象是以序列化流來傳輸到遠端,然後在遠端重新生成對象。這樣就可能在兩個Java虛擬機中交換對象了。但是序列化是這種傳遞對象的一部分。當你序列化對象時,你僅僅是把對象的成員數據轉化成字節流,而實際實現該對象的代碼卻沒有。也就是說,傳遞的只是數據部分,而做爲控制邏輯的程序代碼部分卻沒有被傳遞。這就是RMI初學者輕易誤解的地方,我已經序列化對象了,而且對象也傳過去了,怎麼還說找不到呢。其實,對象數據的確過去了,不過找不到是類定義,這個並不是序列化傳過去的,RMI協議是不傳遞代碼的。但是,對於本地沒有的類文件的對象,RMI提供了一些機制答應接收對象的一方去取回該對象的類代碼。而到什麼地方去取,這就需要發送方設置codebase了。 

二、什麼是codebase 

簡單說,codebase就是遠程裝載類的路徑。對象發送者序列化對象時,會在序列化流中附加上codebase的信息。 這個信息告訴接收方到什麼地方尋找該對象的執行代碼。

你要弄清楚哪個設置codebase,而哪個使用codebase。任何程序假如發送一個對方可能沒有的新類對象時就要設置codebase(例如jdk的類對象,就不用設置codebase)。 

codebase實際上是一個url表,在該url下有接受方需要下載的類文件。假如你不設置codebase,那麼你就不能把一個對象傳遞給本地沒有該對象類文件的程序。 

三、怎樣設置codebase 

在大多數情況下,你可以在命令行上通過屬性java.rmi.server.codebase來設置codebase。例如,假如你在機器url上運行web服務器,端口是8080,你所提供下載的類文件在webserver的根目錄下。那麼運行應用程序的java 命令行: 


-Djava.rmi.server.codebase=http://url:8080/

這就是告訴任何接受對象的程序,假如本地沒有類文件,可以從這個url下載。 

四、類文件應該在什麼地方 

如上所示,當接收程序試圖從url的webserver上下載代碼時,它會把對象的包名轉化成目錄,到相對於codebase 的該目錄下尋找(這點和classpath是一樣的)。例如,假如你傳遞的是類文件yourgroup.project.bean的實例,那麼接受方就會到下面的url去下載類文件: 


-Djava.rmi.server.codebase=http://url:8080/yourgroup/project/bean.class

一定要保證你把類文件放到webserver根目錄下的正確位置,這樣這些類文件才能被找到。另一方面,假如你把所有的類文件包裝成jar文件,那麼設置codebase時就要明確的指出這個jar文件。(這又和 classpath一致了,其實codebase就是網絡範圍的類路徑。)例如你的jar文件是myclasses.jar,那麼codebase 如下: 


-Djava.rmi.server.codebase=http://url:8080/myclasses.jar

你注重這兩種形式的不同。用jar文件後面不用跟‘/’,而用路徑的一定用跟‘/’。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章