Представим, что у нас есть два приложения. Они имеют разные пакеты. И вообще находятся на разных хостах.
Класс клиента.
package rmi;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Client {
public static void main(String[] args) throws Exception {
Registry registry = LocateRegistry.getRegistry("192.168.0.102", 1099);
ServerRemote remote = (ServerRemote) registry.lookup("Server");
remote.doSomthing();
}
}
Класс Сервера.
package rmiAnother;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
public class Server implements ServerRemote{
public static void main(String[] args) throws Exception {
Registry registry = LocateRegistry.createRegistry(1099);
ServerRemote stub = (ServerRemote) UnicastRemoteObject.exportObject(new Server(), 1099);
registry.bind("Server", stub);
while(true){
System.out.println("Ждем...");
Thread.sleep(Integer.MAX_VALUE);
}
}
@Override
public boolean doSomething() throws RemoteException {
return false;
}
}
Классы интерфейсов.
package rmiAnother;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ServerRemote extends Remote {
boolean doSomething() throws RemoteException;
}
package rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ServerRemote extends Remote {
boolean doSomething() throws RemoteException;
}
При выполнении данного кода, выбьет ошибку.
Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to rmi.ServerRemote
at rmi.Client.main(Client.java:10)
Связана она, с невозможностью скастовать объект, к новому интерфейсу. Т.к при бинде, использовался интерфейс пакета rmiAnother. А в клиенте, при .lookup() пытается скастовать к интерфейсу, из пакета rmi.
Теперь сам вопрос, можно ли в RMI на стороне клиента, адаптировать полученный объект, к абсолютно идентичному интерфейсу, но из другого пакета?
Просто делать dependency клиента от сервера, нет возможности. Поэтому я тут вижу только вариант, просто изменить classpath к интерфейсу на стороне клиента. Да бы оно совпадало, с classpath на стороне сервера. Но это не очень красиво выглядит. Когда все аккуратно было складировано по пакетам в клиенте, и появляется левый пакет, содержащий в себе пару интерфейсов для RMI с путями как на сервере.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники