嗨,我试图运行结合一个类来命名服务器的Java应用程序,但我不断地得到一个ClassNotFoundException
首先,我启动注册表:
rmiregistry的
然后从eclipse我尝试执行服务器,但得到此错误
java.rmi.ServerException:服务器线程中发生RemoteException; 嵌套异常是:java.rmi.UnmarshalException:错误解组参数; 嵌套异常是:java.lang.ClassNotFoundException:sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396)的sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)中的progInternet2008.commons.NominabileFactory at sun.rmi.transport.Transport $ 1.run(Transport.java:159)位于sun.rmi的sun.rmi.transport.Transport.serviceCall(Transport.java:155)的java.security.AccessController.doPrivileged(Native Method) .transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0(TCPTransport.java:790)at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.运行(TCPTransport.java:649)java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)at java.lang .hread.run(Thread.java:619)位于sun.rmi的sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233). server.UnicastRef.invoke(UnicastRef.java:359)位于sun.rmi.registry.RegistryImpl_Stub.rebind(未知来源)的progInternet2008.Pozzobon.tesi.Slave.main(Slave.java:54)引起:java.rmi. UnmarshalException:错误解组参数; 嵌套异常是:java.lang.ClassNotFoundException:sun.rmi.registry.RegistryImpl_Skel中的progInternet2008.commons.NominabileFactory.
我已经阅读了RMI Java教程,但仍然无法使其工作......
作为VM Arguments,我设置了这个:
-Djava.rmi.server.codebase =文件:$ {} workspace_loc/progInternet2008
请帮我
(我正在使用Java 6)
rmiregisrty
从/ bin,/ build或/ build/classes文件夹运行命令,无论哪个文件夹是构建文件的根目录.
我花了半天时间试图解决同样的问题.
发生异常是因为rmiregistry应用程序不知道从哪里加载类.当您尝试绑定RMI注册表中的对象时,注册表将下载该对象的类定义.其他一些答案告诉你通过设置rmiregistry应用程序的类路径来解决这个问题,以便它在启动时具有类定义,并且不需要下载任何内容,但Sun的Java RMI教程 RMI)">明确表示不要做这个.我怀疑这有可能导致注册表中的类版本与服务器上的类之间发生冲突.
处理问题的正确方法是按照您尝试的方式设置java.rmi.server.codebase属性.该属性要求使用正斜杠终止目录路径,如下所示:
-Djava.rmi.server.codebase=file:${workspace_loc}/progInternet2008/
如果$ {workspace_loc}变量是相对路径并且rmiregistry应用程序未在同一目录中启动,那么您可能也遇到问题,因此相对路径不正确.如果您将路径设为绝对路径,或者在相应的目录中启动rmiregistry,则ClassNotFoundException应该消失.有关更详细的信息,请参阅java.rmi.server.codebase属性的教程.
好吧,我刚刚克服了这个问题.确保当你运行rmiregistry
你的CLASSPATH
环境变量设置.
例如,您可能有一个脚本:
set CLASSPATH=[path to jdbc driver].jar rmiregistry.exe
这就是让我丢失的类路径工作所需的全部内容.我不确定如何发送-cp commandline
给rmiregistry.exe
.它的文档非常缺乏.