Вызов плагина с параметрами в eclipse - PullRequest
0 голосов
/ 17 июня 2020

У меня есть класс java, который вызывает плагины. Структура моего приложения

Структура приложения

Здесь папка плагинов содержит разные пакеты, и каждый пакет содержит плагины. Приложение плагина содержит Main. java, которое вызывает банку плагина, AbstractPlugin. java содержит 2 абстрактных метода и PluginLoader. java проверяет наличие плагинов в файле config.cfg и загружает плагин. В config.cfg все jar-файлы плагинов представлены в виде пары ключ-значение. Код для Main. java

import java.io.File;
import java.io.IOException;
import java.util.HashMap;

import com.example.plugincall.AbstractPlugin;
import com.example.plugincall.PluginLoader;
import com.example.plugincall.PluginLoader.PluginData;

public class Main {
    public static void main(String[] args) {
        final File plugin_list = new File("C:\\Users\\RajendraPrasadH\\eclipse-workspace\\PluginApp\\src\\config.cfg");

        try {
            PluginLoader.parseConfig(plugin_list, null);
            System.out.println("Success of calling PluginLoader.parseConfig");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        final HashMap<String, PluginData> plugin_datas = PluginLoader.getPlugins();
        System.out.println("plugin_datas contain" + plugin_datas);
        final AbstractPlugin[] plugins = new AbstractPlugin[plugin_datas.size()];
        System.out.println("The plugins are " + plugins);
        try {
            int i = 0;
            for (String key : plugin_datas.keySet()) {
                plugins[i++] = PluginLoader.newInstance(plugin_datas.get(key));
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        for (AbstractPlugin plugin : plugins) {
            plugin.start();
        }

        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        for (AbstractPlugin plugin : plugins) {
            plugin.interrupt();
            try {
                plugin.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            plugin.close();

        }

    }

}

Код для AbstractPlugins. java

package com.example.plugincall;

public abstract class AbstractPlugin extends Thread {

    @Override
    public abstract void run();

    public abstract void close();
}

Код для PluginLoader. java

package com.example.plugincall;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashMap;

public class PluginLoader {
    public static class PluginData {
        public final String name;
        public final String pack;
        public final URL file;
        public final Class<?> cache;

        public PluginData(String name, String pack, URL file) throws ClassNotFoundException {
            this.name = name;
            System.out.println("Name inside PluginData is" + name);
            this.pack = pack;
            System.out.println("Pack inside PluginData is" + pack);
            this.file = file;
            System.out.println("File inside PluginData is" + this.file);
            cache = Class.forName(this.pack, true, new URLClassLoader(new URL[] { this.file }));
        }
    }

    final private static HashMap<String, PluginData> data = new HashMap<>();

    public static void parseConfig(File file, String plugin_root) throws IOException, ClassNotFoundException {
        // TODO Auto-generated method stub
        final BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
        System.out.println("BufferedReader executed in PluginLoader");
        String in;
        int line = 0;
        while ((in = br.readLine()) != null) {
            System.out.println("br.readLine() value is" + in);
            line++;
            System.out.println("Value of in.isEmpty()" + in.isEmpty());
            if (in.isEmpty()) {
                continue;
            }
            final String[] split = in.split(" ");
            System.out.println("value of split is" + split[1]);
            if (split.length < 2) {
                br.close();
                throw new RuntimeException("Could not split line in configuration file" + in + " on line " + line);

            }
            System.out.println("calling data");
            if (data.get(split[0]) != null) {
                br.close();
                throw new RuntimeException("Atempt to replace loaded plugin" + split[0] + " on line " + line);
            }

            data.put(split[0],
                    new PluginData(split[0], split[1], new File(plugin_root, split[0] + ".jar").toURI().toURL()));
        }
        br.close();
    }

    public static AbstractPlugin newInstance(PluginData data) throws InstantiationException, IllegalAccessException {
        System.out.println("The value of (AbstractPlugin) data.cache.newInstance() is" + data.cache.newInstance());
        return (AbstractPlugin) data.cache.newInstance();

    }

    public static HashMap<String, PluginData> getPlugins() {
        System.out.println("value of PluginLoader.data is" + PluginLoader.data);
        return PluginLoader.data;
    }

}

config. cfg содержит

Plugin1 com.plugins.Plugin1

Мне нужно передать строковый аргумент при вызове плагина. Этот строковый аргумент, который должен быть передан плагинам, получен из другого файла, и он должен быть передан плагину, когда он называется. Я внес изменения в подключаемый модуль, чтобы принять строковый аргумент. Какие изменения мне следует внести в файлы java, чтобы я мог также передать параметр при вызове подключаемого модуля, и я запускаю его в eclipse в Windows а не cmd.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...