2012-03-02 54 views
6

下面的方法:java.rmi.ServerException:的RemoteException發生在服務器線程(ClassNotFoundException的)

private void startServer() { // snippet that starts the server on the local machine 
    try { 
     RemoteMethodImpl impl = new RemoteMethodImpl(); 
     Naming.rebind("Illusive-Server" , impl); 
    }catch(Exception exc) { 
     JOptionPane.showMessageDialog(this, "Problem starting the server", "Error", JOptionPane.ERROR_MESSAGE); 
     System.out.println(exc); 
    } 
} 

拋出此異常:java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException: Interfaces.RemoteMethodIntf

當我開始我的項目,我招呼着在消息JOptionPane說問題啓動服務器,然後上述異常。這可能是什麼原因?

我不明白爲什麼例外的最後聲明說類未找到EXC時,我有進口權的包

回答

11

有三種情況下此異常。

  1. 當導出:你沒有運行「RMIC」,你沒有采取在序言中對UnicastRemoteObject描述的Javadoc的措施,讓不必要的。

  2. 綁定時:註冊表沒有存根或遠程接口或它們依賴於其類路徑的東西。

  3. 查找時:客戶端在其類路徑中沒有這些東西。

這是情況2.註冊表無法找到指定的類。

有四種方案:

  1. 與包括相關的JAR文件或目錄CLASSPATH啓動註冊表。

  2. 開始在服務器JVM註冊表,通過LocateRegistry.createRegistry().

  3. 使用動態存根,如在序言中UnicastRemoteObject.的Javadoc描述然而,你可能當時仍運行與遠程接口本身還是同樣的問題一個它依賴的類,在這種情況下,上面的1-3仍然適用於那個類/那些類。

  4. 使用代碼庫功能。這實際上是一個部署選項,IMO在最初的開發階段需要避免。

+0

問題已解決,但我們是否還需要存根文件? – 2012-03-03 07:39:28

+0

@SuhailGupta查看'java.rmi.server.UnicastRemoteObject'的序言。如果您使用Java <1.5或者您沒有遵循這些準則,則只需生成存根類。當你有這個例外時,很明顯這其中的一個是真實的。 – EJP 2012-03-03 09:07:22

+0

我正在使用java> 1.5。我的課程擴展了UnicastRemoteObject。我有點過時了嗎? [這是我用過的小代碼](http://suhail03.my3gb.com/doubt.html) – 2012-03-03 15:52:05

3
Remote Server Error:RemoteException occurred in server thread; nested exception is: 
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
java.lang.ClassNotFoundException: mathInterface 

錯誤很簡單的解決是執行以下步驟:

  • 例如你的java文件考慮d驅動
  • 啓動rmiregistry的d盤(如d:\啓動rmiregistry的)然後不要在其他驅動器上啓動rmiregistry,它會產生上述錯誤

(無論你的文件是,開始rmiregistry

+0

哇,這實際上爲我工作...雖然我不知道爲什麼?任何人都可以解釋這裏發生了什麼? – ultrajohn 2013-08-01 13:58:28

+1

@ultrajohn查看我的回答。這是因爲它將所需的類放在註冊表的CLASSPATH上,但只有當該類不在包中時才起作用。如果是這樣,它將無法工作。 -1由於缺乏解釋和特例解決方案。 – EJP 2014-08-26 06:06:10

-1

您可以從任何地方啓動rmiregistry,但您必須確保已編譯的類已經在您的類路徑中。例如: -

E:\ARMSRemoteUpdater\WebContent\WEB-INF\classes>set classpath=%classpath%;E:\ARMSRemoteUpdater\WebContent\WEB-INF\classes <ENTER> 

E:\ARMSRemoteUpdater\WebContent\WEB-INF\classes>c: <ENTER> 

C:\>rmiregistry 

而上述應該很好。一般來說,如果從已編譯類的根位置(上例是E:\ ARMSRemoteUpdater \ WebContent \ WEB-INF \ classes)啓動rmiregistry,那將起作用,因爲。 (點 - 當前目錄)已經在您的類路徑中設置。

但是,只要您刪除。 (點當前目錄),上面的工作條件也會失敗。

希望我已經詳細解釋過了。

相關問題