java.rmi.ServerException:在服务器线程中发生RemoteException(ClassNotFoundException)

以下方法:

private void startServer() { // snippet that starts the server on the local machine try { RemoteMethodImpl impl = new RemoteMethodImpl(); Naming.rebind( "Illusive-Server" , impl ); }catch(Exception exc) { JOptionPane.showMessageDialog(this, "Problem starting the server", "Error", JOptionPane.ERROR_MESSAGE); System.out.println(exc); } } 

抛出这个exception: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException: Interfaces.RemoteMethodIntf java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException: Interfaces.RemoteMethodIntf

当我开始我的项目时,我在JOptionPane中的消息问候说, 启动服务器的问题,然后上述exception。 这可能是什么原因?

我不明白为什么最后一个exception声明说, 当我导入了正确的包时,类没有findexc

这种例外有三种情况。

  1. 导出时:您没有运行“rmic”,而且您没有将UnicastRemoteObject的Javadoc的序言中描述的步骤作为必要步骤。

  2. 绑定时:registry没有存根或远程接口或它们依赖的类path。

  3. 当向上看时:客户端在类path上没有这些东西。

这是情况2.registry找不到指定的类。

有四个解决scheme:

  1. 使用包含相关JAR或目录的CLASSPATH启动registry。

  2. 通过LocateRegistry.createRegistry().启动服务器JVM中的registryLocateRegistry.createRegistry().

  3. 使用dynamic存根,如UnicastRemoteObject.的Javadoc的序言中所述UnicastRemoteObject. 然而,你仍然可能遇到与远程接口本身或它所依赖的类相同的问题,在这种情况下,上述1-3仍然适用于该类/那些类。

  4. 使用代码库function。 这实际上是一个部署选项,IMO在最初的开发阶段需要避免。

 Remote Server Error:RemoteException occurred in server thread; nested exception is: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException: mathInterface 

解决这个错误很简单,执行以下步骤:

  • 比如你的java文件考虑D盘
  • 启动rmiregistry D盘(示例D:\ start rmiregistry),然后不要在其他驱动器上启动rmiregistry,它会产生上述错误

(无论你的文件是什么,启动rmiregistry

你可以从任何地方启动rmiregistry,但你必须确保已编译的类已经在你的类path中。 例如:-

 E:\ARMSRemoteUpdater\WebContent\WEB-INF\classes>set classpath=%classpath%;E:\ARMSRemoteUpdater\WebContent\WEB-INF\classes <ENTER> E:\ARMSRemoteUpdater\WebContent\WEB-INF\classes>c: <ENTER> C:\>rmiregistry 

而以上应该工作正常。

一般情况下,如果从编译类的根目录(例如E:\ ARMSRemoteUpdater \ WebContent \ WEB-INF \ classes)启动rmiregistry,那将会起作用。 (点 – 当前目录)已经在您的类path中设置。

但一旦你删除。 (dot – current directory),上面的工作条件也会失败。

希望我已经详细解释了。