Скомпилируйте и запустите агенты Jade, используя JavaCompiler и URLClassLoader.

Я не могу найти способ выполнить свой класс агента JADE, вызвав JavaCompiler вручную. Я пытаюсь реализовать симулятор и добавил функцию импорта, которая позволяет людям загружать свои классы агентов JADE, и я буду выполнять их на симуляторе для извлечения данных.

Вот код импорта:

            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

            int result = compiler.run(null, null, null, importedClassPath);
            System.out.println("résultat de la compilation Agent JADE : " + result);

            int result2 = compiler.run(null, null, null,
                    "C:\\Users\\Administrateur\\Desktop\\RoboticsWorkspace\\RuntimeProject\\src\\AcompileJadeMain.java");

            System.out.println("résultat de la compilation MAIN : " + result2);

            File classesDir = new File(
                    "C:\\Users\\Administrateur\\Desktop\\RoboticsWorkspace\\RuntimeProject\\bin\\");
            File classesDir2 = new File(
                    "C:\\Users\\Administrateur\\Desktop\\RoboticsWorkspace\\RuntimeProject\\bin\\");

            URLClassLoader classLoader, classloader2;

            try
            {
                // Loading the class
                classLoader = URLClassLoader.newInstance(new URL[] { classesDir.toURI().toURL() });
                classloader2 = URLClassLoader.newInstance(new URL[] { classesDir2.toURI().toURL() });

                Class<?> cls, cls2;

                cls = Class.forName(importedClassname, true, classLoader);
                cls2 = Class.forName("AcompileJadeMain", true, classloader2);

                Object instanceAgent = cls.newInstance();
                Object instanceMainAgent = cls2.newInstance();

                Method call;
                try
                {
                    call = cls2.getMethod("main", String[].class);
                    String[] args = new String[0];
                    call.invoke(null, new Object[] { args });

                } catch (NoSuchMethodException | SecurityException | IllegalArgumentException
                        | InvocationTargetException e1)
                {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }

            } catch (MalformedURLException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClassNotFoundException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InstantiationException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

и вот основное, что компилируется:

String[] commande = new String[3];
String argument="";
argument = argument+"Robocar:ACompilJade(20,25,7,10,Est,5)";
commande[0]="-cp C:\\Users\\Administrateur\\Documents\\Eclipse_BackupProjects\\jade.jar;"
        +"C:\\Users\\Administrateur\\Desktop\\RoboticsWorkspace\\RuntimeProject\\bin ";
commande[1]="jade.boot -agents ";
commande[2]=argument;
jade.Boot.main(commande);

Я попытался включить как пути для JADE.rar, так и пути класса агента, но он по-прежнему позволяет найти класс агента, и я получаю следующую ошибку:

Ошибка не найден класс агента

Я также импортирую файл jade.rar в путь сборки моего проекта.


person ALEXANDRA LutinNoir    schedule 29.06.2020    source источник
comment
у вашего ACompilJade есть пакет?   -  person nikelyn    schedule 24.07.2020
comment
нет, он стоит по умолчанию   -  person ALEXANDRA LutinNoir    schedule 09.08.2020


Ответы (1)


Я обычно использую следующую строку для запуска агентов из файла класса в моей Java IDE.

bootOptions[n] = "FA:"+Facilitator.class.getCanonicalName();

Я не уверен, что вы можете передавать аргументы в этот ACompilJade(20,25,7,10,Est,5)";. Но если вы можете, мне было бы интересно узнать, как это сделать.

Я обычно:

  1. Создайте подкласс Robocar1 со свойствами (20,25,7,10,Est,5) или
  2. Отправьте данные этому агенту после его запуска. (Я знаю, что это боль, поэтому меня интересует более простой метод).
person Clintus    schedule 02.07.2020
comment
Вы спрашиваете, как вызвать ваших агентов из подкласса, я спрашиваю, как их удаленно выполнить с помощью компилятора внутри другой программы. Однако передать аргументы в агенты, как это сделал я, очень просто: вы пишете свой загрузочный класс Jade так, как это сделал я, а затем в класс агента (тот, который расширяет агент, вы добавляете следующее: Object[] args = getArguments(); а затем if (args != null) { анализировать аргументы, которые вам нужны, в переменные агента и вуаля } Надеюсь, это поможет - person ALEXANDRA LutinNoir; 04.07.2020