Java 正在运行rmi服务器,classnotfound

Java 正在运行rmi服务器,classnotfound,java,eclipse,rmi,rmiregistry,Java,Eclipse,Rmi,Rmiregistry,您好,我正在尝试运行一个java应用程序,它将一个类绑定到命名服务器,但我经常收到一个ClassNotFoundException 首先,我启动注册表: 注册处 然后从eclipse中,我尝试执行服务器,但得到了这个错误 java.rmi.ServerException:服务器线程中发生RemoteException;嵌套异常是: java.rmi.UnmarshalException:错误解组参数;嵌套异常是: java.lang.ClassNotFoundException:progInte

您好,我正在尝试运行一个java应用程序,它将一个类绑定到命名服务器,但我经常收到一个ClassNotFoundException

首先,我启动注册表:

注册处

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

java.rmi.ServerException:服务器线程中发生RemoteException;嵌套异常是: java.rmi.UnmarshalException:错误解组参数;嵌套异常是: java.lang.ClassNotFoundException:progInternet2008.commons.NominabileFactory 位于sun.rmi.server.UnicastServerRef.oldDispatchUnicastServerRef.java:396 位于sun.rmi.server.UnicastServerRef.dispatchUnicastServerRef.java:250 在sun.rmi.transport.transport$1.runTransport.java:159 位于java.security.AccessController.doPrivilegeEdNative方法 位于sun.rmi.transport.transport.serviceCallTransport.java:155 java:535 位于sun.rmi.transport.tcp.tcpttransport$ConnectionHandler.run0tcpttransport.java:790 位于sun.rmi.transport.tcp.tcpttransport$ConnectionHandler.runtcpttransport.java:649 位于java.util.concurrent.ThreadPoolExecutor$Worker.runTaskThreadPoolExecutor.java:886 位于java.util.concurrent.ThreadPoolExecutor$Worker.runThreadPoolExecutor.java:908 java:619 位于sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServerStreamRemoteCall.java:255 位于sun.rmi.transport.StreamRemoteCall.executeCallStreamRemoteCall.java:233 位于sun.rmi.server.UnicastRef.invokeUnicastRef.java:359 位于sun.rmi.registry.RegistryImpl_Stub.rebinUnknown源 在progInternet2008.Pozzobon.tesi.Slave.mainsave.java:54 原因:java.rmi.unmarshaleException:错误解组参数;嵌套异常是: java.lang.ClassNotFoundException:progInternet2008.commons.NominabileFactory 位于sun.rmi.registry.RegistryImpl_Skel.Dispatch未知源 位于sun.rmi.server.UnicastServerRef.oldDispatchUnicastServerRef.java:386 位于sun.rmi.server.UnicastServerRef.dispatchUnicastServerRef.java:250 在sun.rmi.transport.transport$1.runTransport.java:159 位于java.security.AccessController.doPrivilegeEdNative方法 位于sun.rmi.transport.transport.serviceCallTransport.java:155 java:535 位于sun.rmi.transport.tcp.tcpttransport$ConnectionHandler.run0tcpttransport.java:790 位于sun.rmi.transport.tcp.tcpttransport$ConnectionHandler.runtcpttransport.java:649 位于java.util.concurrent.ThreadPoolExecutor$Worker.runTaskThreadPoolExecutor.java:886 位于java.util.concurrent.ThreadPoolExecutor$Worker.runThreadPoolExecutor.java:908 java:619 原因:java.lang.ClassNotFoundException:progInternet2008.commons.NominabileFactory 在java.net.URLClassLoader$1.runURLClassLoader.java:200 位于java.security.AccessController.doPrivilegeEdNative方法 位于java.net.URLClassLoader.findClassURLClassLoader.java:188 位于java.lang.ClassLoader.LoadClassLoader.java:307 位于java.lang.ClassLoader.LoadClassLoader.java:252 位于java.lang.ClassLoader.loadClassInternalClassLoader.java:320 位于java.lang.Class.ForName0的本机方法 java:247 位于sun.rmi.server.LoaderHandler.loadProxyInterfacesLoaderHandler.java:711 位于sun.rmi.server.LoaderHandler.loadProxyClassLoaderHandler.java:655 位于sun.rmi.server.LoaderHandler.loadProxyClassLoaderHandler.java:592 位于java.rmi.server.RMIClassLoader$2.loadProxyClassRMIClassLoader.java:628 位于java.rmi.server.RMIClassLoader.loadProxyClassRMIClassLoader.java:294 位于sun.rmi.server.MarshalInputStream.resolveProxyClassMarshalInputStream.java:238 位于java.io.ObjectInputStream.readProxyDescObjectInputStream.java:1531 位于java.io.ObjectInputStream.readClassDescObjectInputStream.java:1493 位于java.io.ObjectInputStream.ReadOrderinaryObjectInputStream.java:1732 在java.io.ObjectInputStream.readObject0ObjectInputStream.java:1329 位于java.io.ObjectInputStream.ReadObjectInputStream.java:351 ... 还有12个

我已经阅读了RMI Java教程,但仍然无法让它工作

作为VM参数,我设置了以下内容:

-Djava.rmi.server.codebase=文件:${workspace\u loc}/progInternet2008

请帮帮我


我使用的是Java6,我非常确定您必须使用与应用程序相同的类路径启动RMI服务器。我相信它采用与java相同的参数,即-cp[您的类路径]。

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

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

set CLASSPATH=[path to jdbc driver].jar
rmiregistry.exe
这就是让我丢失的类路径正常工作所需要的一切。我不确定如何将-cp命令行发送到rmiregistry.exe。它的文件
由于rmiregistry应用程序不知道从何处加载类,因此出现了异常。当您尝试绑定RMI注册表中的对象时,注册表将下载该对象的类定义。其他一些答案告诉您,通过设置rmiregistry应用程序的类路径,使其在启动时具有类定义,而不需要下载任何东西,但Sun的Java RMI教程除外。我怀疑这可能会导致注册表中的类版本与服务器上的类版本之间发生冲突

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

-Djava.rmi.server.codebase=file:${workspace_loc}/progInternet2008/
如果${workspace\u loc}变量是相对路径,并且rmiregistry应用程序未在同一目录中启动,因此相对路径不正确,则也可能会遇到问题。如果将路径设置为绝对路径,或者在适当的目录中启动RMI注册表,则ClassNotFoundException应该消失。有关更多详细信息,请参阅。

尝试在VM参数末尾添加/bin:

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

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

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

完成的,我从JDK1.6.0\u33升级到了1.7.0\u45,遇到了同样的问题。我找到了此文档,并通过启动以下注册表解决了此问题:

rmiregistry-Djava.rmi.server.useCodebaseOnly=false

请参阅下文

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

在linux机器上运行以下命令

export CLASSPATH="<server_class_path>"
设置类路径后,运行rmiregistry

从/bin、/build或/build/classes文件夹(以生成文件的根文件夹为准)运行rmiregisrty命令


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

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

rmiregistry-J-Djava.rmi.server.useCodebaseOnly=false

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


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

您是否最终解决了此问题?文件:codebase URL仅在客户端和服务器位于同一台计算机上时才起作用,在这种情况下,您根本不需要codebase功能,或者当它指向的共享驱动器在客户端和服务器上看起来相同时,这意味着一个局域网,在这里,你是否需要这个功能仍然是个疑问。Sun的RMI教程明确告诉你不要这样做。这会引起问题。@A.Levy他们到底在哪里说的?这可能导致问题的唯一方法是使用codebase功能。upvote。这是最后10个问题中唯一有效的解决方法。useCodeBaseOnly=false不能用作参数-Djava.security.policy=设置所有权限的文件也不起作用-Djava.rmi.server.codebase=some.jar不能像其他人所说的那样工作……本教程之所以这么说,是因为它使用了codebase特性,并且破坏了codebase特性。否则这不是问题。问题中没有证据表明类文件位于bin目录中。没有使用类路径为您“以正确的方式”启动它,因为它无法提前知道您的类路径。这取决于你自己。不要怪工具,非常感谢!这只适用于最简单的本地跑步。你救了25个人!谢谢,这就是我需要的答案!我更进一步,只是使用命令LocateRegistry.createRegistry1099在代码中启动了注册表;你是怎么发现的?@lolynns当你说RMI服务器时,你是指RMI注册表应用程序还是应用程序的服务器组件与客户端组件?
echo $CLASSPATH
rmiregistry &