Как создать подключаемую Java-программу? - PullRequest
35 голосов
/ 25 августа 2008

Я хочу создать программу на Java, которая может быть расширена с помощью плагинов. Как я могу это сделать и где мне искать?

У меня есть набор интерфейсов, которые должен реализовать плагин, и он должен быть в банке. Программа должна следить за новыми банками в относительной (к программе) папке и как-то их регистрировать.


Хотя мне нравится Eclipse RCP, я думаю, что это слишком много для моих простых потребностей.

То же самое относится и к весне, но так как я все равно собирался посмотреть на это, я мог бы также попробовать это.

Но, тем не менее, я бы предпочел найти способ создать свой собственный плагинный "каркас" как можно более простым.

Ответы [ 6 ]

44 голосов
/ 25 августа 2008

Я сделал это для программного обеспечения, которое написал в прошлом, это очень удобно. Я сделал это, сначала создав Интерфейс, который должны были реализовать все мои классы плагинов. Затем я использовал Java ClassLoader для загрузки этих классов и создания их экземпляров.

Один из способов сделать это - это:

File dir = new File("put path to classes you want to load here");
URL loadPath = dir.toURI().toURL();
URL[] classUrl = new URL[]{loadPath};

ClassLoader cl = new URLClassLoader(classUrl);

Class loadedClass = cl.loadClass("classname"); // must be in package.class name format

Это загрузило класс, теперь вам нужно создать его экземпляр, предполагая, что имя интерфейса - MyModule:

MyModule modInstance = (MyModule)loadedClass.newInstance();
17 голосов
/ 25 августа 2008

Посмотрите на OSGi .

С одной стороны, OSGi предоставляет все виды инфраструктуры для управления, запуска и выполнения многих других задач с модульными программными компонентами. С другой стороны, это может сделать меня слишком тяжелым для ваших нужд.

Кстати, Eclipse использует OSGi для управления своими плагинами.

15 голосов
/ 25 августа 2008

Я рекомендую вам внимательно изучить API поставщика услуг Java (SPI) . Он предоставляет простую систему для нахождения всех классов во всех Jar-файлах на пути к классам, которые представляют себя как реализующие определенный сервис. Я использовал его в прошлом с системами плагинов с большим успехом.

6 голосов
/ 21 декабря 2008

Хотя я буду вторым принятым решением, если требуется базовая поддержка плагинов (что имеет место в большинстве случаев), существует также Java Plugin Framework (JPF), который, хотя и отсутствует Правильная документация, очень аккуратная реализация плагинов.

Он легко разворачивается и - когда вы проходите через особенности загрузки классов - очень прост в разработке. Комментарий к вышеупомянутому состоит в том, что необходимо знать, что пути загрузки подключаемого модуля ниже каталога подключаемого модуля должны быть названы в соответствии с full classpath в дополнение к развертыванию его файлов классов в обычном пути пакета с именем path. Э.Г.

plugins
`-com.my.package.plugins
  `-com
    `-my
      `-package
        `-plugins
          |- Class1.class
          `- Class2.class
4 голосов
/ 30 сентября 2008

При домашнем подходе к загрузчикам классов: Хотя это определенно хороший способ узнать о загрузчиках классов, есть нечто, называемое «ад классных загрузчиков», в основном известное людям, которые боролись с ним, когда дело доходит до использования в больших проектах. Конфликтующие классы легко вводить и трудно решить.

И есть веская причина, почему Eclipse перешла на OSGi много лет назад. Так что, если это более чем любимый проект, серьезно взгляните на OSGi. Это стоит посмотреть. Вы узнаете о загрузчиках классов, а также о новых технических стандартах.

1 голос
/ 25 августа 2008

Рассматривали ли вы создание поверх платформы Rich Client Platform Eclipse, а затем раскрыли структуру расширения Eclipse?

Также, в зависимости от ваших потребностей, Spring Framework может помочь с этим и другими вещами, которые вы, возможно, захотите сделать: http://www.springframework.org/

...