实例化rmiregistry的Server类时出现运行时异常

时间:2011-01-24 07:22:51

标签: java classpath rmi

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

e:\java\rmi final>javac *.java
e:\java\rmi final>rmic ServerImplement
e:\java\rmi final>rmiregistry 20361  
<< BLANK , fine >>
e:\java\rmi final>java ServerMain 20361  
java.rmi.ServerException: RemoteException occurred in server thread;   
nested exception is:     
     java.rmi.UnmarshalException: error unmarshalling arguments;   
nested exception is:  

        java.lang.ClassNotFoundException: ServerImplement_Stub
        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:885)  
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)  

        at java.lang.Thread.run(Thread.java:619)  
        at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)  
        at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
        at sun.rmi.server.UnicastRef.invoke(Unknown Source)
        at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
        at java.rmi.Naming.rebind(Unknown Source)
        at ServerMain.main(ServerMain.java:9)  
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:

        java.lang.ClassNotFoundException: ServerImplement_Stub
        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:885)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
        at java.lang.Thread.run(Thread.java:619)

Caused by: java.lang.ClassNotFoundException: ServerImplement_Stub

        at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
        at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:434)
        at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
        at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
        at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
        at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
        at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1575)
        at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
        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 more

这是我的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 is uploaded on the server. on port 20361

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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