通过RMI从服务器上的方法调用隐藏实现超类发送接口对象?

时间:2014-11-12 02:50:44

标签: java rmi

假设我有课程SuperNode和界面Node

SuperNode implements Node

我有一个RMI-Implementation服务器端,我试图从一个方法发送Node而没有用户拥有SuperNode的源文件,但他们确实有接口Node。

public Node RMIImplServer.getNode();

当我这样做时,我收到此错误:

  

java.rmi.UnmarshalException:错误解组返回;嵌套   异常是:java.lang.ClassNotFoundException:   SEHT.somepackage.SuperNode(没有安全管理器:RMI类加载器   在sun.rmi.server.UnicastRef.invoke(未知来源)at   java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(未知   来源)at   java.rmi.server.RemoteObjectInvocationHandler.invoke(未知来源)     at com.sun.proxy。$ Proxy0.getDataNodes(Unknown Source)引起:   java.lang.ClassNotFoundException:SEHT.somepackage.SuperNode(no   安全管理器:禁用RMI类加载器)   sun.rmi.server.LoaderHandler.loadClass(未知来源)at   sun.rmi.server.LoaderHandler.loadClass(未知来源)at   java.rmi.server.RMIClassLoader $ 2.loadClass(未知来源)at   java.rmi.server.RMIClassLoader.loadClass(未知来源)at   sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)at   java.io.ObjectInputStream.readNonProxyDesc(未知来源)at   java.io.ObjectInputStream.readClassDesc(未知来源)at   java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)at   java.io.ObjectInputStream.readObject0(未知来源)at   java.io.ObjectInputStream.readObject(未知来源)at   java.util.ArrayList.readObject(未知来源)at   sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)at   sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)at   java.lang.reflect.Method.invoke(未知来源)at   java.io.Object.StreamClass.invokeReadObject(未知来源)at   java.io.ObjectInputStream.readSerialData(未知来源)at   java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)at   java.io.ObjectInputStream.readObject0(未知来源)at   java.io.ObjectInputStream.readObject(未知来源)at   sun.rmi.server.UnicastRef.unmarshalValue(Unknown Source)... 5更多

我试图做的是什么,如果是这样,我做错了什么,任何帮助都会受到赞赏。

最后想通了......由于我没有检查过的愚蠢默认值,jar文件并没有包含正确的文件。非常感谢EJP的帮助。

1 个答案:

答案 0 :(得分:0)

客户端不需要任何源文件。但是,它确实需要远程方法返回的所有类型的对象文件(.class)文件,在其CLASSPATH,上可用,除非:

...如果您不想部署SuperNode.class或客户端的任何内容,您可以使用代码库功能。这太复杂了。

  1. 您需要在客户端安装安全管理器。
  2. 您需要在服务器JVM上定义系统属性java.rmi.server.codebase
  3. 您需要将其设置为一个或多个客户端可理解的URL,并命名包含要动态加载的类的JAR文件。通常,代码库项是HTTP URL。请注意,引用服务器本地文件系统的代码库项目无法正常工作,因为客户端无法理解。