Я пытаюсь реализовать базовое распределенное приложение с использованием инфраструктуры Java RMI.
Реализуя его локально, я могу это сделать, но когда я хочу удаленно управлять загрузкой динамических классов, загружая соответствующие файлы .class классов на HTTP-сервер в «Удаленно» (используя виртуальные машины в той же локальной сети). ), клиент не может правильно загрузить .class для заглушки:
Exception in thread "main" java.lang.NoClassDefFoundError: Example1 / RemoteAdd).
Я попытался запустить Сервер на компьютере с Windows вместе с Реестром RMI, а на другой виртуальной машине с Ubuntu (подключенным через локальную сеть) - Клиентом (также на этом компьютере также имеется веб-сервер HTTP с файлами). учебный класс).
Но ничего, я получаю исключение:
Exception in thread "main" java.lang.NoClassDefFoundError: Example1 / RemoteAdd.
IP Window Machine (Сервер и реестр RMI): 192.168.56.1
IP Ubuntu Machine (клиент и HTTP-сервер): 192.168.1.70
Это класс Сервера:
package Esempio1;
import java.rmi.Naming;
import java.security.Policy;
public class ServerAdd {
public ServerAdd() {
try {
System.setProperty("java.rmi.server.hostname","192.168.56.1");
System.setProperty("java.rmi.server.useCodebaseOnly","false");
System.setProperty("java.security.policy","policy.txt");
System.setProperty("java.rmi.server.codebase","http://192.168.1.70/Root/");
System.out.println(System.getProperty("java.rmi.server.codebase"));
System.out.println(System.getProperty("java.rmi.server.useCodebaseOnly"));
System.setSecurityManager(new SecurityManager());
RemoteAdd a = new ImpAdd();
Naming.rebind("add", a);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main (String[] args) {
new ServerAdd();
}
}
А это Клиент:
package Esempio1;
import java.rmi.Naming;
public class ClientAdd {
public ClientAdd() {
try {
System.setProperty("java.security.policy","policy.txt");
System.setProperty("java.rmi.server.useCodebaseOnly","false");
System.out.println(System.getProperty("java.rmi.server.useCodebaseOnly"));
System.out.println(System.getProperty("java.security.policy"));
if(System.getSecurityManager()==null) {
System.setSecurityManager(new SecurityManager());
}
RemoteAdd a = (RemoteAdd) Naming.lookup("rmi://192.168.56.1:1099/add");
Integer x = new Integer(8);
Integer y = new Integer(2);
Integer c = a.sommaIng(x, y);
System.out.print(c.getClass()+" "+c);
} catch (Exception e) {
System.out.println(e);
}
}
public static void main (String[] args) {
new ClientAdd();
}
}
Сначала я отправляю реестр RMI следующим образом:
start rmiregistry -J-Djava.rmi.server.useCodebaseOnly=false
Затем я запускаю сервер на той же машине, что и реестр, и он работает нормально ...
Наконец, я запускаю Клиент на машине с Ubuntu и получаю эту ошибку обратно:
Exception in thread "main" java.lang.NoClassDefFoundError: Esempio1/RemoteAdd
at Esempio1.ClientAdd.<init>(ClientAdd.java:23)
at Esempio1.ClientAdd.main(ClientAdd.java:37)
Caused by: java.lang.ClassNotFoundException: Esempio1.RemoteAdd
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 2 more
Также используется файл политики:
grant
{
permission java.security.AllPermission ;
};
HTTP-сервер работает в Ubuntu через службу Apache2 и содержит корневую папку с Esempio1 внутри и все файлы .class (192.168.1.70/Root/Esempio1)
Кто-нибудь знает, где я не прав?