Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正在运行rmi服务器,classnotfound_Java_Eclipse_Rmi_Rmiregistry - Fatal编程技术网

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.oldDispatch(UnicastServerRef.java:396) 在sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250) 在sun.rmi.transport.transport$1.run(transport.java:159) 位于java.security.AccessController.doPrivileged(本机方法) 位于sun.rmi.transport.transport.serviceCall(transport.java:155) 位于sun.rmi.transport.tcp.tcpttransport.handleMessages(tcpttransport.java:535) 位于sun.rmi.transport.tcp.tcpttransport$ConnectionHandler.run0(tcpttransport.java:790) 位于sun.rmi.transport.tcp.tcpttransport$ConnectionHandler.run(tcpttransport.java:649) 位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 运行(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) 位于sun.rmi.registry.RegistryImpl_Stub.rebind(未知源) 在progInternet2008.Pozzobon.tesi.Slave.main上(Slave.java:54) 原因:java.rmi.unmarshaleException:错误解组参数;嵌套异常是: java.lang.ClassNotFoundException:progInternet2008.commons.NominabileFactory 在sun.rmi.registry.RegistryImpl_Skel.dispatch(未知源)处 位于sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386) 在sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250) 在sun.rmi.transport.transport$1.run(transport.java:159) 位于java.security.AccessController.doPrivileged(本机方法) 位于sun.rmi.transport.transport.serviceCall(transport.java:155) 位于sun.rmi.transport.tcp.tcpttransport.handleMessages(tcpttransport.java:535) 位于sun.rmi.transport.tcp.tcpttransport$ConnectionHandler.run0(tcpttransport.java:790) 位于sun.rmi.transport.tcp.tcpttransport$ConnectionHandler.run(tcpttransport.java:649) 位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 运行(Thread.java:619) 原因:java.lang.ClassNotFoundException:progInternet2008.commons.NominabileFactory 在java.net.URLClassLoader$1.run(URLClassLoader.java:200) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.net.URLClassLoader.findClass(URLClassLoader.java:188) 位于java.lang.ClassLoader.loadClass(ClassLoader.java:307) 位于java.lang.ClassLoader.loadClass(ClassLoader.java:252) 位于java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 位于java.lang.Class.forName0(本机方法) 位于java.lang.Class.forName(Class.java:247) 位于sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:711) 位于sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:655) 位于sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:592) 位于java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628) 位于java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294) 位于sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238) 位于java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1531) 位于java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1493) 位于java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732) 位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) 位于java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) ... 还有12个

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

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

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

请帮帮我


(我使用的是Java 6)

我非常确定,您必须使用与应用程序相同的类路径启动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/
-Djava.rmi.server.codebase=file:${workspace_loc}/progInternet2008/bin
export CLASSPATH="<server_class_path>"
echo $CLASSPATH
rmiregistry &