Проблема с загрузкой плагинов java, упакованных в jar, содержащиеся ресурсы - PullRequest
1 голос
/ 18 июля 2011

У меня проблема с дизайном моего приложения. У меня есть основное приложение (назовем его 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 и вставить его в определенный каталог в приложении? Это тоже кажется плохим решением.

Я понятия не имею, как спроектировать мое приложение и плагины. Любые идеи будут оценены.

Ответы [ 2 ]

1 голос
/ 18 июля 2011

Попробуйте использовать Class.getResource или Class.getResourceAsStream .

Например,

BufferedReader reader = new BufferedReader(
        new InputStreamReader(Plugin.class.getResourceAsStream("sampletxt")));

Где Plugin - это имякласс вашего плагина.

0 голосов
/ 06 августа 2013

Я только что столкнулся с проблемой, похожей на эту. В вашем плагине я бы назвал:

File f = FileLocator.toFileUrl(getClass().getResource("/sampletext.txt")).getFile();
...