我是在 Windows 7 上使用 RMI 的新手,我想用 RMI 运行我的项目以显示“HelloWorld”,但我无法运行它,因为我遇到了以下错误。任何人都可以帮助我。我也使用过JDK 1.6。
我的错误是:
java.rmi.UnmarshalException:解组参数错误;嵌套异常是:
java.lang.ClassNotFoundException: Hello_Stub
我是在 Windows 7 上使用 RMI 的新手,我想用 RMI 运行我的项目以显示“HelloWorld”,但我无法运行它,因为我遇到了以下错误。任何人都可以帮助我。我也使用过JDK 1.6。
我的错误是:
java.rmi.UnmarshalException:解组参数错误;嵌套异常是:
java.lang.ClassNotFoundException: Hello_Stub
您可以通过三种方式获得此异常:
构造/导出远程对象时。在这种情况下,这意味着您没有为super(int port...)
远程对象扩展UnicastRemoteObject,
或UnicastRemoteObject.exportObject()
其他情况提供端口号参数,并且您还没有通过rmic
. 请注意,如果您提供端口号参数,即使为零,您根本不需要运行rmic
。
将远程对象绑定/重新绑定到注册表时(在服务器中)。在这种情况下,这意味着您没有像上面那样提供端口号等,但是您已经生成了存根,否则您不会因为(1)而走到这一步,但是_Stub 类对注册表不可用它的类路径。最简单的解决方案是在同一个 JVM 中运行 Registry,通过LocateRegistry.createRegistry()
. 请注意,此方法的返回值需要存储在不会被垃圾回收的地方,例如静态变量中。
查找注册表时(在客户端)。在这种情况下,这意味着您没有像上面那样提供端口号等,但是您已经生成了存根,否则由于 (1) 和 (2),您不会走到这一步,但是_Stub 类不可用到其 CLASSPATH 上的客户端。解决方案:将其部署到客户端。
听起来您可能正在关注本教程的过时版本:http: //docs.oracle.com/javase/1.5.0/docs/guide/rmi/hello/hello-world.html。如果不是这种情况,请在命令行 ( java -version
) 上检查您的 Java 版本。