Как использовать Java RMI с динамической загрузкой классов через HTTP-сервер? - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь реализовать базовое распределенное приложение с использованием инфраструктуры 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)

Кто-нибудь знает, где я не прав?

...