2013-06-02 89 views
3

我正在使用rmi工作在twitter上。 我在Windows上工作,一切正常。java.rmi.server.codebase不能在linux上工作

但在Linux上,我有:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: server.SimpleBark 
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:196) 
    ... 

此異常彈出的客戶端,它似乎是在客戶端不使用代碼庫服務器,代碼庫服務器不接收任何連接。

我再說一遍,在Windows上一切正常,我找不到這是從哪裏來。

+0

如果代碼在Windows上工作,它可能是主機名問題或其他相關問題嗎?你有沒有嘗試指定以下內容:-Djava.rmi.server.hostname = ipAddressHere? – rimero

+0

我只在一臺計算機上工作,除了代碼庫服務器,一切工作正常,是的,我試過-Djava.rmi.server.hostname它沒有改變任何東西 – Giacogiac

回答

4

From the JDK 7 guides

從JDK 7更新21中,RMI財產java.rmi.server.useCodebaseOnly 被默認設置爲true。

From the JDK 7 guides, that hasn't been updated

java.rmi.server.useCodebaseOnly

如果該值爲true,類加載自動禁止 除了從本地CLASSPATH,並從java.rmi中.server.codebase 在此VM上設置的屬性。使用此屬性可防止來自 的客戶端虛擬機動態下載其他代碼庫中的字節碼。這個屬性 在1.2和1.2.1的實現中由於錯誤而被忽略。

因此,Windows機器上的Java版本似乎已過時。一旦更新,解決此問題的最佳方法是在客戶端包含所需的類,而不是通過網絡動態加載類。

+0

謝謝,-Djava.rmi.server.useCodebaseOnly =假造成了這個伎倆。 但是這是一個學校的項目,我需要動態加載類。 我有一種方法可以安全地做到這一點嗎? – Giacogiac

0

只需從客戶端和註冊表類路徑中刪除類即可。