#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
класс доступным и в клиенте.