运行rmi服务器,classnotfound
您好我试图运行一个Java应用程序绑定到命名服务器的类,但我不断得到一个ClassNotFoundException
首先我开始registry:
rmiregistry的
然后从日食我尝试执行服务器,但得到这个错误
java.rmi.ServerException:在服务器线程中发生RemoteException; 嵌套exception是:java.rmi.UnmarshalException:错误解组参数; 嵌套的exception是:在sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)在sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396)处的java.lang.ClassNotFoundException:progInternet2008.commons.NominabileFactory sun.rmi.transport.Transport $ 1.run(Transport.java:159)at sun.rmi.transport.Transport.serviceCall(Transport.java:155)at sun.rmi 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.run (TCPTransport.java:649)at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)at java.lang。在sun.rmi.transport.StreamR上的sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)上的Thread.run(Thread.java:619) emoteCall.executeCall(StreamRemoteCall.java:233)at 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:错误解组参数; 嵌套的exception是:sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:386)sun.rmi上的sun.rmi.registry.RegistryImpl_Skel.dispatch(未知源):java.lang.ClassNotFoundException:progInternet2008.commons.NominabileFactory 。sun.rmi.transport.server上的.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)在sun.rmi.transport处的java.security.AccessController.doPrivileged(Native Method)处运行$ 1.run(Transport.java:159)。 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)在sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run(TCPTransport.java:649)在java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)在java.util.concurrent.ThreadPoolExecutor $工作.run(ThreadPoolExecutor.java:908)at java.lang.Thread.run(Thread.java:619)引起:java.lang.ClassNotFoundException:progInternet2 java.net.URLClassLoader上的008.commons.NominabileFactory在java.net.URLClassLoader.findClass上的java.security.AccessController.doPrivileged(Native方法)上的$ 1.run(URLClassLoader.java:200)(java中的URLClassLoader.java:188) .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。在sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:711)的sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler。)上的java.lang.Class.forName(Class.java:247)处的forName0(Native Method) java:655)在java.rmi.server.RMIClassLoader上的sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:592)在java.rmi.server.RMIClassLoader.loadProxyClass()上的$ 2.loadProxyClass(RMIClassLoader.java:628)在java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1531)处的sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238)处的RMIClassLoader.java:294) 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教程,但仍然无法正常工作…
作为虚拟机参数我已经设置了这个:
-Djava.rmi.server.codebase =文件:$ {} workspace_loc / progInternet2008
请帮帮我
(我正在使用Java 6)
从/ bin,/ build或/ build / classes文件夹中运行rmiregisrty
命令,无论哪个文件夹是构build文件的根目录。
我花了半天的时间试图解决同样的问题。
发生exception是因为rmiregistry应用程序不知道从哪里加载类。 当您尝试绑定RMIregistry中的对象时,registry将下载该对象的类定义。 其他一些答案告诉你通过设置rmiregistry应用程序的类path来解决这个问题,以便在启动时具有类定义,并且不需要下载任何东西,但是Sun的Java RMI教程明确表示不这样做这个 。 我怀疑这有可能导致registry中类的版本和服务器上的类之间发生冲突。
处理这个问题的正确方法是设置java.rmi.server.codebase属性,就像你试图做的那样。 该属性要求目录path以正斜杠结尾,如下所示:
-Djava.rmi.server.codebase =文件:$ {} workspace_loc / progInternet2008 /
如果$ {workspace_loc}variables是一个相对path,并且rmiregistry应用程序未在同一目录中启动,那么您可能也会遇到麻烦,因此相对path不正确。 如果要么绝对path,要么在适当的目录下启动rmiregistry,ClassNotFoundException应该消失。 有关更多详细信息,请参阅java.rmi.server.codebase属性的教程 。
好的,我只是克服了这个问题。 确保在运行rmiregistry
时设置了CLASSPATH
环境variables。
例如,你可能有一个脚本:
set CLASSPATH=[path to jdbc driver].jar rmiregistry.exe
这就是我所需要的,以便让我失去的类path工作。 我不知道如何发送-cp commandline
到rmiregistry.exe
。 它的文档相当缺乏。
我相当肯定你必须使用与你的应用程序相同的类path来启动你的RMI服务器。 我相信它采用与java相同的参数,即-cp [your class path]
。
尝试在您的VM Arg的末尾添加/ bin:
-Djava.rmi.server.codebase=file:${workspace_loc}/progInternet2008/bin
您将运行的文件位于此目录中,因此您需要将其包含在path中。
我从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
我遇到了同样的问题,为了解决这个问题,确保在运行rmiregistry时将CLASSPATH设置为包含服务器类的path。
在Linux机器上运行以下命令。
export CLASSPATH="<server_class_path>"
确保已经设置了CLASSPATH :
echo $CLASSPATH
一旦设置了类path,运行rmiregistry
rmiregistry &
我花了一整天的时间卸载并重新安装JDK,并更改了类path和环境variables。 但罪魁祸首是,司令部开始并没有以适当的方式启动司法pipe理 。 所以,感谢这个页面上的评论,解决scheme是暂时取消 CLASSPATH。 这是通过命令set CLASSPATH=
closures最初启动rmiregistry的cmd窗口。在新的cmd中,转到项目类文件所在的位置(直到bin),然后使用以下命令启动registry:
rmiregistry -J-Djava.rmi.server.useCodebaseOnly = false
如果您正在使用Eclipse,请运行ServerSideProject并将ImplementationClass实例绑定到指定的URL。
只要在绑定方法下面打印一行,看看它是否被打印。 如果打印成功,这意味着你的服务器工作正常。