2012-04-05 97 views
0

我有一个简单的RMI服务器,它将文件存储在地图中,并在请求时返回它们。存储在地图中的文件的类型是Object。我已经这样做了,所以我不需要将包含特定文件存储的项目的其他部分导入库(有没有其他方法可以做到这一点?)。RMI远程异常:java.lang.ClassNotFoundException

我不应该没有导入,因为存储的类型是对象吗?在发生错误的同时,我得到了Java Finalizer线程崩溃。这里是堆栈:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: util.MyClass (no security manager: RMI class loader disabled) 
Invalid memory access of location 0x0 rip=0x7fff91016390 <<< this is from crash 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:334) 
    at sun.rmi.transport.Transport$1.run(Transport.java:159) 
    at java.security.AccessController.doPrivileged(Native Method) 

而且这里是一些来自客户端的代码:

public void uploadProjects(List<MyClass> projects) { 
     try { 
      Object obj = projects; 
      rmiServer.upload(channel, obj); // <<<< exception on this line 
     } catch (RemoteException ex) { 
      Logger.getLogger(RMIClient.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

,这里是接口方法:

void upload(String channel, Object projects) throws RemoteException; 

难道我做错了什么呢?如果不需要导入特定的类,它应该不会在Object中正常工作吗?我也尝试过使用安全管理器,但它只会导致更多的麻烦,并且必须执行AllPermissions才能工作(在其他项目上)...

崩溃并不总是发生,但它必须是由RMI引起的。

回答

0

保存在Map中的对象的类型就是你放入它的任何东西,以及客户端通过它的CLASSPATH必须访问的任何类型。