Исключение Java RMI - ClassNotFound

Я создаю программу Java RMI, но получаю исключение ClassNotFoundException. Не могли бы вы, ребята, помочь мне разобраться? Я использую Eclipse. Кто-то предложил мне, что это проблема кода, но как это соотносится? Вот коды для моего сервера и клиента:

Сервер:

package server;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import base.Server;
import base.RmiStarter;
public class ServerImplStarter extends RmiStarter{
 public ServerImplStarter() {
 super(Server.class);
 }
 @Override
 public void doCustomRmiHandling() {
 try{
 Server engine = new ServerImpl();
 Server engineStub = (Server)UnicastRemoteObject.exportObject(engine, 0);
 Registry registry = LocateRegistry.createRegistry( 1099 );
 registry = LocateRegistry.getRegistry();
 registry.rebind("Server", engineStub);
 }catch(Exception e){
 e.printStackTrace();
 }
 }
 public static void main(String[] args){
 new ServerImplStarter();
 }
}

Клиент:

package client;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import base.RmiStarter;
import base.Server;
import base.Cell;
public class CellClient extends RmiStarter {
 public CellClient() {
 super(Server.class);
 }
 @Override
 public void doCustomRmiHandling() {
 try{
 Registry registry = LocateRegistry.getRegistry();
 Server server = (Server)registry.lookup("Server");
 Cell c = null;
 c = server.getcell();
 }catch(Exception e){
 e.printStackTrace();
 }
 }
 public static void main(String[] args) {
 new CellClient();
 }
}

и ошибка такова:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
 java.lang.ClassNotFoundException: server.CellImpl
 at sun.rmi.server.UnicastRef.invoke(Unknown Source)
 at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
 at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
 at $Proxy0.getcell(Unknown Source)
 at client.CellClient.doCustomRmiHandling(CellClient.java:23)
 at base.RmiStarter.<init>(RmiStarter.java:19)
 at client.CellClient.<init>(CellClient.java:13)
 at client.CellClient.main(CellClient.java:31)
Caused by: java.lang.ClassNotFoundException: server.CellImpl
 at java.net.URLClassLoader$1.run(Unknown Source)
 at java.net.URLClassLoader$1.run(Unknown Source)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(Unknown Source)
 at java.lang.ClassLoader.loadClass(Unknown Source)
 at java.lang.ClassLoader.loadClass(Unknown Source)
 at java.lang.Class.forName0(Native Method)
 at java.lang.Class.forName(Unknown Source)
 at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
 at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
 at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source)
 at java.rmi.server.RMIClassLoader.loadClass(Unknown Source)
 at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)
 at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
 at java.io.ObjectInputStream.readClassDesc(Unknown Source)
 at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
 at java.io.ObjectInputStream.readObject0(Unknown Source)
 at java.io.ObjectInputStream.readObject(Unknown Source)
 at sun.rmi.server.UnicastRef.unmarshalValue(Unknown Source)
 ... 8 more
</init></init>
3 ответа

Оба клиента и сервера должны иметь одинаковое имя пакета. Вчера у меня была такая же ошибка, я исправил ее после многих поисков. Попробуйте и скажите, возникла ли другая ошибка.

Отметьте это как ответ, если вы найдете это. Спасибо!


CellImpl не экспортируется и не предоставляется через клиент CLASSPATH. Он должен либо (a) расширить UnicastRemoteObject, либо экспортироваться через UnicastRemoteObject.exportObject(); или (b) быть Сериализуемым и доступным на клиенте CLASSPATH.


Решение для исключения NoClassFound при запуске клиента RMI.

Случай:

Файлы сервера и клиента находятся в разных папках.

Пример:

Серверная сторона: интерфейс сервера и реализация сервера находятся внутри Папка проекта: C:\RMIServer Пакет: rmiserver

Клиентская сторона: интерфейс сервера и клиент находятся внутри Папка проекта: C:\RMIClient Пакет: rmiClient

Проблема: Не удалось найти расположение интерфейса сервера.

Решение. На стороне клиента, 1. Создайте имя пакета rmiServer (имя пакета должно совпадать с пакетом на стороне сервера). 2. Поместите заглушку сервера внутри этого пакета. 3. Клиент .java находится внутри пакета rmiClient. Теперь импортируйте пакет rmiServer в файл client.java. import rmiServer. *;

Это решит исключение классаNotFound, которое произойдет, когда мы выполним RMI на стороне клиента.

licensed under cc by-sa 3.0 with attribution.