0

问题似乎很流行-> 使用 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();
        }

    }

}

我指望一些好的建议!

提前致谢,

4

0 回答 0