Исключение RMI ClassNotFoundException

#java #rmi #classnotfoundexception

#java #rmi #classnotfoundexception

Вопрос:

На прошлой неделе я создавал приложение RMI и наткнулся на препятствие, с которым, похоже, не поможет никакое использование Google.

Следующий код используется для отправки объекта с сервера клиенту через RMI:

Серверный код:

 import rocks.Rock;
import rocks.squareRock;

import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Server extends UnicastRemoteObject
        implements RemInterface {

    public Server() throws RemoteException {
        super();
    }

    public static void main(String argv[]) {
        try {
            Server serv = new Server();
            Naming.rebind("RockServer", serv);
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    public Rock getRock() {
        return new squareRock();
    }
}
  

Клиентский код:

 import rocks.Rock;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

public class Client {
    RemInterface reminterface = null;

    public Client() {
        String strName = "rmi://127.0.0.1/RockServer";
        try {
            reminterface = (RemInterface) Naming.lookup(strName);
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (NotBoundException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

    public Rock loadRock() {
        try {
            return reminterface.getRock();
        } catch (Throwable t) {
            return null;
        }
    }
}
  

Интерфейс:

 public interface RemInterface {
    public Rock getRock() throws RemoteException;
}
  

В этой ситуации:

  • Класс «Rock» доступен как в пути к классам клиента, так и сервера.
  • Класс «Rock» реализует сериализуемость.
  • «squareRock» расширяет класс rock и доступен только в пути к классу сервера.

Ошибка, которую я получаю при попытке вызвать метод с использованием Rock из loadRock() на клиенте, заключается в следующем:

 STDERR: java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
java.lang.ClassNotFoundException: SquareRock
  

Буду признателен за любую помощь.

Ответ №1:

Вы возвращаете объект типа rocks.squareRock с сервера. Во время процесса десериализации на клиенте этот класс потребуется для того, чтобы создать экземпляр этого класса для представления ответа от сервера. Поскольку вы уже указали, что класс доступен только в пути к классам сервера, невозможность найти и загрузить указанный класс вызывает исключение.

Решение будет заключаться в том, чтобы сделать rocks.squareRock класс доступным и в клиенте.