运行rmi服务器,classnotfound

时间:2009-01-21 10:12:01

标签: java eclipse rmi rmiregistry

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

首先我启动注册表:

  

rmiregistry中

然后从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)       at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0(TCPTransport.java:790)       at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run(TCPTransport.java:649)       at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)       at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)       在java.lang.Thread.run(Thread.java:619)       at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)       at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)       at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359)       at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)       在progInternet2008.Pozzobon.tesi.Slave.main(Slave.java:54)   引起:java.rmi.UnmarshalException:错误解组参数;嵌套异常是:       java.lang.ClassNotFoundException:progInternet2008.commons.NominabileFactory       at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)       at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386)       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)       at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0(TCPTransport.java:790)       at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run(TCPTransport.java:649)       at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)       at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)       在java.lang.Thread.run(Thread.java:619)   引起:java.lang.ClassNotFoundException:progInternet2008.commons.NominabileFactory       在java.net.URLClassLoader $ 1.run(URLClassLoader.java:200)       at java.security.AccessController.doPrivileged(Native Method)       在java.net.URLClassLoader.findClass(URLClassLoader.java:188)       at java.lang.ClassLoader.loadClass(ClassLoader.java:307)       at java.lang.ClassLoader.loadClass(ClassLoader.java:252)       at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)       at java.lang.Class.forName0(Native Method)       at java.lang.Class.forName(Class.java:247)       at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:711)       at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:655)       at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:592)       at java.rmi.server.RMIClassLoader $ 2.loadProxyClass(RMIClassLoader.java:628)       at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294)       at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)       在java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1531)       at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1493)       at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)       at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)       at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)       ......还有12个

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

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

  

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

请帮帮我

(我正在使用Java 6)

9 个答案:

答案 0 :(得分:46)

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

我花了半天的时间试图解决同样的事情。

答案 1 :(得分:24)

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

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

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

如果$ {workspace_loc}变量是相对路径并且rmiregistry应用程序未在同一目录中启动,那么您可能也遇到问题,因此相对路径不正确。如果您将路径设为绝对路径,或者在相应的目录中启动rmiregistry,则ClassNotFoundException应该消失。有关详细信息,请参阅explicitly says not to do this

答案 2 :(得分:6)

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

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

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

这就是让我丢失的类路径工作所需的全部内容。我不确定如何将-cp commandline发送给rmiregistry.exe。它的文档非常缺乏。

答案 3 :(得分:4)

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

答案 4 :(得分:2)

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

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

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

答案 5 :(得分:2)

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

rmiregistry -Djava.rmi.server.useCodebaseOnly = false

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

答案 6 :(得分:2)

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

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

export CLASSPATH="<server_class_path>"

确保已设置 CLASSPATH

echo $CLASSPATH

设置好路径后,运行 rmiregistry

rmiregistry &

答案 7 :(得分:2)

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

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

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

只需在绑定方法下面打印一行,然后查看是否打印出来。如果它成功打印,则意味着您的服务器工作正常。

答案 8 :(得分:1)

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

完成的