Представим, что у нас есть два приложения. Они имеют разные пакеты. И вообще находятся на разных хостах.
Класс клиента.
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 с путями как на сервере.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Все прикрутил и пример вставил, даже реализовал веб-проектНо все время возвращает body=null
Разрабатывается приложение, в котором используются фрагментыПытаюсь реализовать смену фрагмента по нажатию на любой item в recyclerView
В java все объект могут быть mutable и immutableПонятно, что, например, строка является immutable
Здравствуйте! Второй день пытаюсь пофиксить проблемуВ проекте пытаюсь достать данные из базы, но вылетает NullPointerException