У меня проблема с дизайном моего приложения. У меня есть основное приложение (назовем его App), основанное на плагинах. Все написано на Java. PLugins динамически загружаются во время запуска приложения. Во время загрузки плагинов приложение ищет определенную локацию (каталог "/ plugins"), а затем загружает плагины, которые упакованы в файлы jar.
Проблема в следующем: когда плагин (упакованный в jar) содержит функциональность, которая закодирована в * файлах классов - все в порядке. Но когда класс плагина использует какие-либо ресурсы (например, текстовый файл, изображение) - возникает проблема, потому что при запуске этого плагина в основном приложении (приложение) я получаю исключение:
java.io.FileNotFoundException: sampletxt (Nie można odnaleźć określonego pliku)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:120)
at java.io.FileInputStream.<init>(FileInputStream.java:79)
at java.io.FileReader.<init>(FileReader.java:41)
Я знаю, почему возникает эта проблема, но я не знаю, как справиться с этой проблемой. Ресурс, который используется классом плагина, всегда присутствует в файле jar. Но проблема вызвана загрузкой только класса плагина в основном приложении (App) - я не загружаю ресурс (sampletxt), потому что я ничего не знаю о ресурсах, которые могут быть использованы классом плагинов.
Чтобы прояснить ситуацию: в главном приложении есть что-то вроде этого:
class App {
public void any method() {
Class<PluginDataGenerator> plugin = jarClassLoader.loadClass("mypackage.plugin."+className, true);
PluginDataGenerator plg = plugin.newInstance();
plg.doAction();
}
}
Итак, в этом коде я загружаю плагин с заданным именем (className).
Теперь у класса Plugin может быть что-то вроде этого кода:
class Plugin {
public void doAction() {
try {
BufferedReader reader = new BufferedReader(new FileReader(
"sampletxt"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
И теперь, когда вызывается метод doAction, я получаю исключение java.io.FileNotFoundException.
Одним из решений, о котором я подумал, является создание «ресурсов» папки в структуре каталогов App и размещение там любых ресурсов, которые могут использовать классы плагинов. Но это не очень хорошее решение, потому что в этом случае плагин (упакованный в jar) будет распространяться независимо от его ресурса.
Другая идея, которую я думаю, - поместить любую запись в файл манифеста в банку. Эта запись может сообщить загрузчику плагинов, какой ресурс должен быть загружен. Но с этой точки зрения, когда код плагина:
BufferedReader reader = new BufferedReader(new FileReader(
"sampletxt"));
выполняется приложение, которое будет искать "sampletext" в главном каталоге приложения, а не в памяти, поэтому в этом случае я должен скопировать ресурс из jar и вставить его в определенный каталог в приложении? Это тоже кажется плохим решением.
Я понятия не имею, как спроектировать мое приложение и плагины. Любые идеи будут оценены.