2011-05-21 64 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类在客户端也可用。