29

嗨,我正在尝试运行一个将类绑定到命名服务器的 java 应用程序,但我不断收到 ClassNotFoundException

首先我启动注册表:

rmir​​egistry

然后从eclipse我尝试执行服务器但得到这个错误

java.rmi.ServerException:服务器线程发生RemoteException;嵌套异常是:java.rmi.UnmarshalException:错误解组参数;嵌套异常是: java.lang.ClassNotFoundException: progInternet2008.commons.NominabileFactory at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250) at sun.rmi.transport.Transport$1.run(Transport.java:159) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:155) at sun.rmi .transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) 在 sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) 在 sun.rmi.transport.tcp.TCPTransport$ConnectionHandler。在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 在 java.lang .Thread.run(Thread.java:619) 在 sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255) 在 sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233) 在 sun.rmi。 server.UnicastRef.invoke(UnicastRef.java:359) at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) at progInternet2008.Pozzobon.tesi.Slave.main(Slave.java:54) 原因:java.rmi。 UnmarshalException:解组参数错误;嵌套异常是:java.lang.ClassNotFoundException: progInternet2008.commons.NominabileFactory at sun.rmi.registry.RegistryImpl_Skel。

我已经阅读了 RMI Java 教程,但仍然无法正常工作......

作为VM Arguments,我设置了这个:

-Djava.rmi.server.codebase=文件:${workspace_loc}/progInternet2008

请帮我

(我正在使用 Java 6)

4

9 回答 9

66

从 /bin、/build 或 /build/classes 文件夹运行rmiregisrty命令,无论哪个文件夹是构建文件的根目录。

我花了半天时间试图解决同样的问题。

于 2015-11-09T02:03:40.747 回答
27

发生异常是因为 rmiregistry 应用程序不知道从哪里加载类。当您尝试在 RMI 注册表中绑定对象时,注册表会下载该对象的类定义。其他一些答案告诉您通过设置 rmiregistry 应用程序的类路径来解决此问题,以便它在启动时具有类定义并且不需要下载任何内容,但 Sun 的 Java RMI 教程明确表示不要这样做这个。我怀疑这有可能导致注册表中类的版本和服务器上的类之间发生冲突。

处理该问题的正确方法是按照您的尝试设置 java.rmi.server.codebase 属性。该属性要求目录路径以正斜杠结尾,如下所示:

-Djava.rmi.server.codebase=文件:${workspace_loc}/progInternet2008/

如果 ${workspace_loc} 变量是相对路径并且 rmiregistry 应用程序未在同一目录中启动,那么您也可能会遇到问题,因此相对路径不正确。如果您将路径设为绝对路径,或者在适当的目录中启动 rmiregistry,ClassNotFoundException 应该会消失。有关更多详细信息,请参阅有关java.rmi.server.codebase 属性的教程。

于 2009-04-22T22:55:31.283 回答
7

好的,我刚刚克服了这个问题。确保在运行时设置rmiregistryCLASSPATH环境变量。

例如,您可能有一个脚本:

set CLASSPATH=[path to jdbc driver].jar
rmiregistry.exe

这就是让我丢失的类路径正常工作所需要的一切。我不确定如何发送-cp commandlinermiregistry.exe. 它的文档非常缺乏。

于 2009-02-16T21:18:54.273 回答
4

我相当肯定您必须使用与您的应用程序相同的类路径来启动您的 RMI 服务器。我相信它采用与 java 相同的参数,即 -cp [your class path]

于 2009-01-21T10:36:07.150 回答
3

关闭最初启动 rmiregistry 的 cmd 窗口。在新的 cmd 中转到项目类文件所在的位置(uptill bin)并使用以下命令启动注册表:

rmir​​egistry -J-Djava.rmi.server.useCodebaseOnly=false

如果您使用的是 Eclipse,请运行 ServerSideProject,您的 ImplementationClass 实例将绑定到指定的 URL。

只需在绑定方法下方打印一行并查看它是否被打印。如果打印成功,则表示您的服务器工作正常。

于 2016-04-19T10:07:28.917 回答
2

我从 JDK1.6.0_33 升级到 1.7.0_45 并且遇到了同样的问题。我找到了这个文档并通过启动 rmiregistry 解决了这个问题:

rmir​​egistry -Djava.rmi.server.useCodebaseOnly=false

请参阅以下 http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/enhancements-7.html

于 2013-11-09T14:52:24.813 回答
2

尝试在 VM Arg 末尾添加 /bin:

-Djava.rmi.server.codebase=file:${workspace_loc}/progInternet2008/bin

您将运行的文件位于此目录中,因此您需要将其包含在路径中。

于 2010-11-26T10:20:55.297 回答
2

我遇到了同样的问题,要解决此问题,请确保在运行rmiregistry时将您的CLASSPATH设置为包含服务器类的路径。

在 linux 机器上运行以下命令。

export CLASSPATH="<server_class_path>"

确保已设置CLASSPATH :

echo $CLASSPATH

设置类路径后,运行rmiregistry

rmiregistry &
于 2015-11-07T23:07:43.697 回答
1

我花了一整天卸载和重新安装我的 JDK 并更改类路径和环境变量。但罪魁祸首是命令start rmigregistry没有以正确的方式启动 rmiregistry。因此,感谢此页面上的评论,解决方案是暂时取消设置CLASSPATH。这是通过命令完成的set CLASSPATH=

于 2012-03-10T19:30:07.167 回答