为 rmiregistry 实例化服务器类时出现运行时异常

Posted

技术标签:

【中文标题】为 rmiregistry 实例化服务器类时出现运行时异常【英文标题】:Runtime Exception while instantiating Server class for rmiregistry 【发布时间】:2011-06-14 08:30:10 【问题描述】:

我在我的 Ubuntu VM 上尝试了相同的程序,该程序甚至产生了正确的输出,但在 Windows 上它给出了一个奇怪的运行时异常:

e:\java\rmi 最终>javac *.java e:\java\rmi final>rmic ServerImplement e:\java\rmi 最终>rmiregistry 20361 > e:\java\rmi final>java ServerMain 20361 java.rmi.ServerException:服务器线程发生RemoteException; 嵌套异常是: java.rmi.UnmarshalException:解组参数错误; 嵌套异常是: java.lang.ClassNotFoundException: ServerImplement_Stub 在 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.TCPTransport.handleMessages(TCPTransport.java:535) 在 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:885) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) 在 java.lang.Thread.run(Thread.java:619) 在 sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(未知来源) 在 sun.rmi.transport.StreamRemoteCall.executeCall(未知来源) 在 sun.rmi.server.UnicastRef.invoke(未知来源) 在 sun.rmi.registry.RegistryImpl_Stub.rebind(未知来源) 在 java.rmi.Naming.rebind(未知来源) 在 ServerMain.main(ServerMain.java:9) 引起:java.rmi.UnmarshalException:错误解组参数;嵌套异常是: java.lang.ClassNotFoundException: ServerImplement_Stub 在 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.TCPTransport.handleMessages(TCPTransport.java:535) 在 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:885) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) 在 java.lang.Thread.run(Thread.java:619) 引起:java.lang.ClassNotFoundException:ServerImplement_Stub 在 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:306) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:251) 在 java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) 在 java.lang.Class.forName0(本机方法) 在 java.lang.Class.forName(Class.java:247) 在 sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:434) 在 sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165) 在 java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620) 在 java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247) 在 sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197) 在 java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1575) 在 java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496) 在 java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732) 在 java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) 在 java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) ... 12 更多

这是我的ServerMain 课程:

import java.io.*;
import java.rmi.*;

class ServerMain

 public static void main(String[] args)
 
   try 
        Naming.rebind("//localhost:"+args[0]+"/TestClass",new ServerImplement());
        System.out.println("TestClass is uploaded on the server. on port "+args[0]);

      
   catch(Exception e)
   
       //System.out.println("FAILED. ERROR: ");
        e.printStackTrace();
    
 

在 Ubuntu 上:

machine@ubuntu:~/rmi final$java ServerMain 20361 TestClass 被上传到服务器上。在端口 20361

【问题讨论】:

【参考方案1】:

您忘记指定-cp 开关。 JVM 真的不知道你的存根在哪里。

【讨论】:

在我看来代码与执行尝试位于同一目录中,所以那里不需要类路径,对吧? 尝试使用 -cp 。和 -classpath 。 bt 没有成功。它仍然显示相同的错误。 :-/【参考方案2】:

知道了。 -cp 开关也没有帮助.. 添加了一个“;”后 ”。”在我的 CLASSPATH 环境变量中。愚蠢的问题.. x-(

【讨论】:

以上是关于为 rmiregistry 实例化服务器类时出现运行时异常的主要内容,如果未能解决你的问题,请参考以下文章

将模型从 tensorflow 转换为 Coreml (4.0) 时出现实例归一化错误

Android错误,无法实例化服务...接口无法实例化

实例化模板类时出现链接器错误

为啥在尝试将 Hibernate Spatial 用于 Spring Boot 项目时出现此错误?实例化异常

两次实例化 QStyledItemDelegate 的子类时出现“Python 已停止工作”错误

实例化记录中的 Svg msg 元素列表时出现奇怪的榆树类型错误