中國(guó)Java開(kāi)發(fā)網(wǎng) - 關(guān)于RMI的經(jīng)驗(yàn)總結(jié)(轉(zhuǎn)貼)
http://expert.csdn.net/Expert/topic/1808/1808981.xml?temp=.5741083 今天終于把一些關(guān)于RMI的頑固問(wèn)題解決了,近來(lái)有很多人在問(wèn)這方面的東東,所以總結(jié)出來(lái)一些經(jīng)驗(yàn)給大家共享。 但是在進(jìn)入主題之前我先說(shuō)些題外話。 上最近不知道怎么了,問(wèn)個(gè)問(wèn)題很少有人實(shí)實(shí)在在的回答,大家都是UP,UP,UP說(shuō)些沒(méi)用的。我發(fā)的很多貼子甚至沒(méi)有什么人留言,其實(shí)都是一些平常的問(wèn)題。感覺(jué)好象都是廢話。不知道怎么會(huì)形成這種風(fēng)氣??當(dāng)昨天liuyt1@163.com給我發(fā)來(lái)我急需的JOBOSS文檔的時(shí)候,我真的很感動(dòng),為什么真心肯幫忙的人就那么少呢?所以這個(gè)貼的分是給他的。其實(shí)分?jǐn)?shù)又不能換錢,沒(méi)有實(shí)際價(jià)值,也只能算是表達(dá)一下我的感謝,意思意思。 今天,又看了一回JBUILDER關(guān)于RMI的幫助,終于解決了些重要的疑問(wèn)??催^(guò)這陣子貼子的人應(yīng)該都知道這段時(shí)間關(guān)于RMI有很多問(wèn)題出現(xiàn),我也看了那些貼子,有的問(wèn)題沒(méi)有解決,有的“解決”了,但根本就沒(méi)有用正確的方法。以下是我的經(jīng)驗(yàn)(但是這不是RMI入門教程,沒(méi)有基礎(chǔ)的請(qǐng)暫時(shí)收藏,以后學(xué)RMI時(shí)相信可以給你些幫助)。這些東西過(guò)來(lái)人肯定知道,但是為什么他們從來(lái)都不告訴我們呢?是不愿,還是不屑呢? 首先要說(shuō)的是最常見(jiàn)的一個(gè)問(wèn)題,客戶端找不到XXX_stub.class文件。這個(gè)問(wèn)題問(wèn)的人最多(包括我自己以前也來(lái)問(wèn)過(guò))。在CSDN上,甚至于我看到的兩本(我就看過(guò)兩本)譯過(guò)來(lái)的中文書(shū)上提出的解決辦法,或潛在的解決方法就是在java的參數(shù)-classpath中加入XXX_stub.class文件相應(yīng)路徑。確實(shí),問(wèn)題一下子解決了,但是我心里感覺(jué)十分不妥!有沒(méi)有人想過(guò),對(duì)于一個(gè)客戶端,難道每個(gè)客戶端都要在本地有一個(gè)XXX_stub.class文件嗎?那么試想一個(gè)Applet,自己就是臨時(shí)從server上下載來(lái)的,難道它有那個(gè)可能在用戶本地機(jī)上“剛好”找到它要調(diào)用的RMI Server 的XXX_stub.class文件嗎?所以,XXX_stub.class文件的獲得也應(yīng)該是動(dòng)態(tài)的下載!應(yīng)該用codebase參數(shù),但是我用codebase參數(shù)還是不行(找不到XXX_stub.class文件),試了一個(gè)星期都沒(méi)有解決。(最后再說(shuō)這個(gè)問(wèn)題的解決) 第二是RMI Server運(yùn)行時(shí)找不到XXX_stub.class文件。有些同志可能是一時(shí)大意沒(méi)有用rmic來(lái)編譯。但是很多人已經(jīng)用rmic編譯生成了XXX_stub.class文件與骨架文件。但是運(yùn)行RMI Server時(shí)還是找不到XXX_stub.class文件,為什么?其實(shí)這個(gè)時(shí)候,找不到XXX_stub.class文件的不是你的Server,而是rmiregistry程序。你的classpath里當(dāng)然是有相應(yīng)錄的,但是rmiregistry起動(dòng)時(shí)的路徑里可沒(méi)有。但是,你先別著急把rmiregistry的參數(shù)里加上相應(yīng)路徑,因?yàn)镴Builder里說(shuō)千萬(wàn)讓rmiregistry知道你的stub文件的路徑,因?yàn)檫@樣客戶端動(dòng)態(tài)下載stub時(shí)會(huì)出問(wèn)題(我還沒(méi)有證實(shí)過(guò)這一點(diǎn)的正確性)。解決辦法是在你起動(dòng)RMI server時(shí)加codebase參數(shù),如下: java -Djava.rmi.server.codebase=http://YourServerName/YourPackagePathName/ packageName.serverClassName 而你的Web Server的YourServerName/YourPackagePathName/目錄下應(yīng)該有一個(gè)與你的包同名的目錄,那個(gè)目錄下有相應(yīng)stub文件。這個(gè)問(wèn)題就圓滿解決了。 第三,不起作用的客戶端java.rmi.server.codebase。接著一個(gè)問(wèn)題說(shuō),我去掉了客戶端classpath目錄里的含有stub文件的那一個(gè)目錄。加上了如下參數(shù): -Djava.rmi.server.codebase=http://YourServerName/YourPackagePathName/ 但是出現(xiàn)錯(cuò)誤: java.lang.ClassNotFoundException: hellormi.GetMessageImpl_Stub (no security manager: RMI class loader disabled) classNotFoundException的意思是找不到相應(yīng)類,但是我確認(rèn)了自已的參數(shù)沒(méi)有錯(cuò),而且Web Server也沒(méi)有任何問(wèn)題。今天在看JBuilder自帶幫助時(shí),忽然發(fā)現(xiàn)在客戶端例子里它竟然也寫(xiě)了:System.setSecurityManager(new RMISecurityManager())。這在我的兩本書(shū)里都沒(méi)有看到,而且其中一本書(shū)上還明確地說(shuō),客戶端里不需要任何安全設(shè)置。我想了想才大夢(mèng)初醒:你lookup的時(shí)候他當(dāng)然不用生成安全管理器,但是當(dāng)你要從server動(dòng)態(tài)下載類的時(shí)候它就要用了!加上這一句之后還沒(méi)有完全OK。要象Server起動(dòng)時(shí)那樣給一個(gè)java.security.policy屬性允許它做相應(yīng)socket工作(否則會(huì)出安全性異常),之后客戶端就能自動(dòng)從主機(jī)下載了stub文件了。 最后補(bǔ)充一點(diǎn),可以通過(guò)編碼System.setProperty("java.rmi.server.codebase","http://YourServerName/YourPackagePathName/")來(lái)代替手工輸入屬性,但是一定要注意把它放在System.setSecurityManager(new RMISecurityManager())之前。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào) 。