问题似乎很流行-> 使用 Eclipse IDE 运行 RMI 服务器时出现 ClassNotFoundException ...当然,我从 http://www.genady.net 深入研究了在 RMI Eclipse 插件中设置代码库参数的所有可能方式。在 SERVER 的 main 中使用该代码:
try{
Registry r = LocateRegistry.getRegistry(1099);
r.rebind("SERVER", new RemotePrinterImpl());
System.out.println("SERVER STARTED!");
}catch(Exception e){
e.printStackTrace();
}
或在 1099 上使用预先启动的 RMIRegistry:
try{
Naming.rebind("SERVER", new RemotePrinterImpl());
System.out.println("SERVER STARTED!");
}catch(Exception e){
e.printStackTrace();
}
当涉及到 Server Impl Stub 时,ClassNotFound ......经过数小时的脱发后,我决定在 try 块中创建注册表,而不是使用它来注册我的服务器:
try{
Registry r = LocateRegistry.createRegistry(1099);
Naming.rebind("SERVER", new RemotePrinterImpl());
System.out.println("SERVER STARTED!");
}catch(Exception e){
e.printStackTrace();
}
有效!!!精湛,但比客户端执行产生了这个:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
java.lang.ClassNotFoundException: demo.rmi.print.server.RemotePrinterImpl_Stub
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Naming.java:101)
at demo.rmi.print.client.PrintClient.main(PrintClient.java:15)
Caused by: java.lang.ClassNotFoundException: demo.rmi.print.server.RemotePrinterImpl_Stub
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.rmi.server.LoaderHandler$Loader.loadClass(LoaderHandler.java:1208)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:270)
at sun.rmi.server.LoaderHandler.loadClassForName(LoaderHandler.java:1221)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:454)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:185)
at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:637)
at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:264)
at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:222)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1610)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1515)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
... 3 more
而且我一点也不知道我应该做什么...... RMIRegistry 是否搞砸了?是代码的错吗?
如果可以,请你帮助我。
以下是代码,打印服务器、打印客户端、打印通用(带有共享接口):
package demo.rmi.print.common;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface RemotePrinter extends Remote {
public String getPrinterStatus() throws RemoteException;
}
///////////////////////////////////////// ////
package demo.rmi.print.server;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import demo.rmi.print.common.RemotePrinter;
public class RemotePrinterImpl extends UnicastRemoteObject implements
RemotePrinter {
public RemotePrinterImpl() throws RemoteException{
super();
}
@Override
public String getPrinterStatus() throws RemoteException {
System.out.println("Requested STATUS?");
return "OK";
}
public static void main(String[] args) {
try{
Registry r = LocateRegistry.createRegistry(1099);
r.rebind("SERVER", new RemotePrinterImpl());
System.out.println("SERVER STARTED!");
}catch(Exception e){
e.printStackTrace();
}
}
}
///////////////////////////////////////// ////
package demo.rmi.print.client;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import demo.rmi.print.common.RemotePrinter;
public class PrintClient {
public static void main(String[] args) {
System.setSecurityManager(new RMISecurityManager());
try{
RemotePrinter printer = (RemotePrinter) Naming.lookup("SERVER");
printer.getPrinterStatus();
}catch(Exception e){
e.printStackTrace();
}
}
}
我指望一些好的建议!
提前致谢,