【发布时间】: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【问题讨论】: