rmi server程序如果在执行server程序的路径下启动rmiregistry,则可以正常运行server程序,如果在其它路径下启动rmiregistry,则总是报告如下错误:
java.rmi.ServerException: RemoteException occurred in server thread; nested exce
ption is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested excep
tion is:
java.lang.ClassNotFoundException: test.PerfectTimeI
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:385
)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
...(以下略)
即无法找到其它类,怎么回事呢?
在网上搜了一下,说是运行的rmiregistry可能是其它版本的jre带的,但我查看了一下rmiregistry的执行窗口,都是JDK1.5_06的(而且也不可能两次查找的PATH不一样啊)
Server程序没什么特别的,就是常见的TIJ中的例子:
//PerfectTimeI.java
//The PerfectTime remote interface
package test;
import java.rmi.*;
public interface PerfectTimeI extends Remote {
long getPerfectTime() throws RemoteException;
}
//PerfectTime.java
//The implementation of the PerfectTime remote object
package test;
import java.net.*;
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.*;
public class PerfectTime
extends UnicastRemoteObject
implements PerfectTimeI {
//默认构件器,也要“掷”出RemoteException违例。
public PerfectTime() throws RemoteException {
super();
}
public long getPerfectTime() throws RemoteException {
return System.currentTimeMillis();
}
public static void main(String [] args) {
/*创建和安装一个安全管理器,令其支持RMI.作为Java开发包的一部分,适用于RMI唯一一个是RMISecurityManager.*/
System.setSecurityManager(new RMISecurityManager());
try {
/*创建远程对象的一个或多个实例,下面是PerfectTime对象*/
PerfectTime pt = new PerfectTime();
/*向RMI远程对象注册表注册至少一个远程对象。一个远程对象拥有的方法即可生成指向其他远程对象的句柄,这样,客户到注册表里访问一次,得到第一个远程对象即可.*/
Naming.rebind("PerfectTime", pt);
System.out.println("Ready to do Time");
} catch (Exception e) {
e.printStackTrace();
}
}
}
---------------------------------------------------------------
java.lang.ClassNotFoundException: test.PerfectTimeI
很明显了。。。是不是?
OK,你在start rmiregistry前
set CLASSPATH=.;E:\一下,然后再执行start rmiregistry
这样后,再执行服务程序
然后再执行客户端程序,就可以了。。。
java.rmi.ServerException: RemoteException occurred in server thread; nested exce
ption is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested excep
tion is:
java.lang.ClassNotFoundException: test.PerfectTimeI
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:385
)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
at sun.rmi.transport.Transport$1.run(Transport.java:153)
...(以下略)
即无法找到其它类,怎么回事呢?
在网上搜了一下,说是运行的rmiregistry可能是其它版本的jre带的,但我查看了一下rmiregistry的执行窗口,都是JDK1.5_06的(而且也不可能两次查找的PATH不一样啊)
Server程序没什么特别的,就是常见的TIJ中的例子:
//PerfectTimeI.java
//The PerfectTime remote interface
package test;
import java.rmi.*;
public interface PerfectTimeI extends Remote {
long getPerfectTime() throws RemoteException;
}
//PerfectTime.java
//The implementation of the PerfectTime remote object
package test;
import java.net.*;
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.*;
public class PerfectTime
extends UnicastRemoteObject
implements PerfectTimeI {
//默认构件器,也要“掷”出RemoteException违例。
public PerfectTime() throws RemoteException {
super();
}
public long getPerfectTime() throws RemoteException {
return System.currentTimeMillis();
}
public static void main(String [] args) {
/*创建和安装一个安全管理器,令其支持RMI.作为Java开发包的一部分,适用于RMI唯一一个是RMISecurityManager.*/
System.setSecurityManager(new RMISecurityManager());
try {
/*创建远程对象的一个或多个实例,下面是PerfectTime对象*/
PerfectTime pt = new PerfectTime();
/*向RMI远程对象注册表注册至少一个远程对象。一个远程对象拥有的方法即可生成指向其他远程对象的句柄,这样,客户到注册表里访问一次,得到第一个远程对象即可.*/
Naming.rebind("PerfectTime", pt);
System.out.println("Ready to do Time");
} catch (Exception e) {
e.printStackTrace();
}
}
}
---------------------------------------------------------------
java.lang.ClassNotFoundException: test.PerfectTimeI
很明显了。。。是不是?
OK,你在start rmiregistry前
set CLASSPATH=.;E:\一下,然后再执行start rmiregistry
这样后,再执行服务程序
然后再执行客户端程序,就可以了。。。