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
这种例外有三种情况。
-
导出时:您没有运行“rmic”,而且您没有将
UnicastRemoteObject
的Javadoc的序言中描述的步骤作为必要步骤。 -
绑定时:registry没有存根或远程接口或它们依赖的类path。
-
当向上看时:客户端在类path上没有这些东西。
这是情况2.registry找不到指定的类。
有四个解决scheme:
-
使用包含相关JAR或目录的CLASSPATH启动registry。
-
通过
LocateRegistry.createRegistry().
启动服务器JVM中的registryLocateRegistry.createRegistry().
-
使用dynamic存根,如
UnicastRemoteObject.
的Javadoc的序言中所述UnicastRemoteObject.
然而,你仍然可能遇到与远程接口本身或它所依赖的类相同的问题,在这种情况下,上述1-3仍然适用于该类/那些类。 -
使用代码库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),上面的工作条件也会失败。
希望我已经详细解释了。