【问题标题】:java rmi client exceptions [duplicate]java rmi客户端异常[重复]
【发布时间】:2009-09-29 18:26:53
【问题描述】:

我正在编写一个 rmi 应用程序。当我将所有类放在一个目录(一个单独的包)中时,一切正常。但是,当我尝试拆分服务器部分和客户端部分时,客户端会发生异常。服务器正常工作。 以下是异常发生后的部分堆栈跟踪:

Exception in thread "main" 
    java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
        java.lang.ClassNotFoundException: com.clientpackage.ClientImpl_Stub (no security manager: RMI class loader disabled)

我使用 unicastRemoteobject 方法将来自客户端的对象实例传递给服务器以进行回调。我还使用 rmic 为对象生成存根文件。似乎该程序在其 CLASSPATH 上找不到该存根类。我想知道如何解决这个问题?

【问题讨论】:

  • 你能解决这个问题吗?

标签: java rmi


【解决方案1】:

问题是您使用的是rmic。除非您使用的是严格 Java 5 之前的 Java 版本,否则不建议这样做。

Java 5 及更高版本将动态生成存根。仅当您必须支持 Java 1.4 或更早版本的客户端时才需要使用 rmic

在 Java 5 及更高版本中,如果存根是用rmic 生成的,并且存在于服务器的类路径中,客户端将尝试通过 RMI 类加载器加载它们,即使它们已经在客户端的类路径中可用。

另外,如果您不打算使用 RMI 类加载器,则无需设置服务器代码库。

【讨论】:

  • +1 因为你显然以前见过这个问题:)
  • 线程“main”java.rmi.StubNotFoundException中的异常:未找到存根类...我摆脱了rmic生成的存根文件。它现在抛出上面的异常显示。你知道这是为什么吗?
  • 1) 您运行的是 Java 5 或更高版本吗? 2) 您是否重新启动了 RMI 注册表? 3) 您是否清理了rmic 产生的所有 工件?
  • 我无法理解您的最后一段。如果存根不在服务器的 CLASSPATH 上,则服务器将无法导出自身,除非可以使用动态代理,在这种情况下,任何人都不会加载存根。
  • @EJP 你的意思是倒数第二段吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 2010-12-21
  • 2019-09-18
相关资源
最近更新 更多