2011-05-21 79 views
0

我一直在過去一週內構建了一個RMI應用程序,並且我遇到了一個障礙,沒有任何Google搜索似乎可以提供幫助。RMI ClassNotFoundException

下面的代碼用於通過RMI從服務器發送的對象給客戶端:

服務器代碼:

import rocks.Rock; 
import rocks.squareRock; 

import java.rmi.Naming; 
import java.rmi.RemoteException; 
import java.rmi.server.UnicastRemoteObject; 

public class Server extends UnicastRemoteObject 
     implements RemInterface { 

    public Server() throws RemoteException { 
     super(); 
    } 

    public static void main(String argv[]) { 
     try { 
      Server serv = new Server(); 
      Naming.rebind("RockServer", serv); 
     } catch (Throwable t) { 
      t.printStackTrace(); 
     } 
    } 

    public Rock getRock() { 
     return new squareRock(); 
    } 
} 

客戶機代碼:

import rocks.Rock; 

import java.net.MalformedURLException; 
import java.rmi.Naming; 
import java.rmi.NotBoundException; 
import java.rmi.RemoteException; 

public class Client { 
    RemInterface reminterface = null; 

    public Client() { 
     String strName = "rmi://127.0.0.1/RockServer"; 
     try { 
      reminterface = (RemInterface) Naming.lookup(strName); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } catch (NotBoundException e) { 
      e.printStackTrace(); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 
    } 

    public Rock loadRock() { 
     try { 
      return reminterface.getRock(); 
     } catch (Throwable t) { 
      return null; 
     } 
    } 
} 

接口:

public interface RemInterface { 
    public Rock getRock() throws RemoteException; 
} 

在這種情況下:

  • 「Rock」類在客戶端和服務器類路徑中都可用。
  • 「Rock」類實現了可序列化。
  • 「squareRock」擴展了class Rock,只能在服務器的類路徑中使用。

試圖在客戶端調用使用來自搖滾loadRock()方法時,我得到的錯誤如下:

STDERR: java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
java.lang.ClassNotFoundException: SquareRock 

任何幫助,將不勝感激。

回答

5

您正從服務器返回類型爲rocks.squareRock的對象。在客戶端的反序列化過程中,爲了創建此類的實例來表示服務器的響應,將需要此類。正如您已經指出該類僅在服務器的類路徑中可用,未能找到並加載該類會導致異常。

該決議將使rocks.squareRock類在客戶端也可用。