JAVA马绍尔群岛共和国。ServerException:服务器线程中发生RemoteException;ClassNotFoundException
当我通过eclipse运行服务器代码时,出现以下异常:
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: com.RMIInterface
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:413)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
at sun.rmi.transport.Transport$1.run(Transport.java:177)
我只需在cmd行中键入“start RMI Registry”即可启动RMI注册表。新窗口打开,标题为“c:\Program Files\Java\jdk1.7.0\bin\rmiregistry.exe”。在这个路径中,只有JDK
我的一切。此路径中可用的类文件:D:\Workspace\Study\bin\com
在com文件夹下,我有三个文件“rminterface,RMIServer,RMIClient”
当我从eclipse运行服务器代码时,我得到了上面提到的异常。(即)未找到接口。但我把它放在同一个文件夹里
我还应该做些什么来运行服务器
这是我的服务器代码:
RMIServer serRef = new RMIServer();
try {
RMIInterface inref = (RMIInterface)UnicastRemoteObject.exportObject(serRef, 0);
Registry reg = LocateRegistry.getRegistry();
reg.bind("ServerObj", inref); -------->Exception in this line
} catch (AlreadyBoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
# 1 楼答案
我认为问题在于你访问界面的方式
正如你所说,
Under the com folder I have all three files "RMIInterface, RMIServer,RMIClient".
如果所有文件都在同一个包/文件夹中,那么为什么要写
com.RMIInterface
它应该是
RMIInterface
,因为您提到的方法是在当前com
包中搜索另一个名为com
的包我希望你明白我的意思
编辑
在运行RMI程序时,我们确实需要运行RMI注册表
您应该在启动服务器程序之前运行
rmiregistry
尝试从控制台或windows中的CMD运行它
在CMD中尝试
rmiregistry
或start rmiregistry
。从CMD运行时,我们确实需要从运行javac
和java
的同一文件夹/包启动rmiregistry。在eclipse的情况下,我想您应该尝试从com文件夹运行rmiregistry更新
我想你现在正试图从com文件夹中启动rmiregistry。只需尝试从com文件夹中启动它
尽管
D:\Workspace\Study\bin\com>start rmiregistry
试一试
D:\Workspace\Study\bin\start rmiregistry
# 2 楼答案
要解决此错误非常简单,请执行以下步骤:
例如,您的java文件考虑d驱动器< /LI>- 启动RMID注册表驱动器(示例D:\Start rmiregistry),然后不要在其他驱动器上启动RMI注册表,这将产生上述错误
(无论文件位于何处,请启动
rmiregistry
)参考:java.rmi.ServerException: RemoteException occurred in server thread (ClassNotFoundException)