У меня есть класс 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.