Найкращий спосіб побудувати плагін-систему з Java


145

Як би ви реалізували плагін-систему для свого додатка Java?

Чи можлива наявність простої у використанні (для розробника) системи, яка досягає наступного:

  • Користувачі поміщають свої плагіни у підкаталог програми
  • Плагін може забезпечити екран конфігурації
  • Якщо ви використовуєте рамку, чи сумісна ліцензія з комерційними розробками?

Відповіді:


107

Спочатку вам потрібен інтерфейс, який потрібно реалізувати всі плагіни, наприклад

public interface Plugin {
    public void load(PluginConfiguration pluginConfiguration);
    public void run();
    public void unload();
    public JComponent getConfigurationPage();
}

Потім автори плагінів повинні зв’язувати свої плагіни у файли JAR. Ваші програми відкривають файл JAR, а потім можуть використовувати атрибут з маніфесту JAR або список усіх файлів у файлі JAR, щоб знайти клас, який реалізує ваш інтерфейс плагінів. Миттєво розвиваючи цей клас, плагін готовий до запуску.

Звичайно, ви також можете захотіти реалізувати якусь пісочницю, щоб плагін був обмежений у тому, що він може, а що не може робити. Я створив невеликий тестовий додатокпро нього провів блог ), який складається з двох плагінів, одному з яких заборонено доступ до місцевих ресурсів.


2
пісочниця, яку ви згадуєте, насправді найважча частина! але не хвилюватися - osgi вже робить це для вас, як було сказано вище.
Чій

1
Пісочниця не така вже й складна. Мені знадобилося близько двох тижнів, щоб дізнатися, як це зробити правильно, але як тільки ти дізнаєшся, що це досить просто. :)
Бомбе

@Bombe це прикладний додаток все ще живе де завгодно?
ataulm

* за допомогою вкладеного файлу, знайденого на сторінці bugs.freenetproject.org/print_bug_page.php?bug_id=1900
ataulm

@ timberwo7ves Я не розумію, що ти маєш на увазі. Додаток для тестування файлів все ще можна завантажити з місця, вказаного у публікації, та зі сторінки, яку ви згадали.
Бомбе

41

Використовуйте OSGi .

Він є основою плагінної системи Eclipse. Equinox - це реалізація Eclipse (ліцензована EPL) та Felix - реалізація проекту Apache (ліцензована публічна ліцензія Apache).

Eclipse - це конкретний приклад того, що OSGi може покрити згадані вами пункти (або ви можете просто побудувати свою програму поверх Eclipse RCP, якщо ви хочете повний стек Eclipse / SWT / JFace).


4
Я спіткав з OSGi, але ніколи не знайшов справді гарного ґрунтовника для цього. Було б чудово, якби хтось міг порекомендувати тут деякі посилання.
Брайан Меттьюз

1
Я вбудував рівнодення у свою програму і використовував стандартні практики OSGi, щоб робити саме те, що хоче ОП. У розпалі теж не SWT. Веб-початок також. хороший стартовий ресурс: neilbartlett.name/blog
basszero

3
OSGi - це ідеально фактична плагінова система. Однак стрибок від стандартної моделі програмування Java до OSGi досить широкий ...
Хенді Іраван

30

З 1.6 з'явився java.util.ServiceLoader, який можна використовувати, якщо ви хочете кодувати свою просту систему.

Але якщо ви хочете щось більше, ніж основні функції, використовуйте одну з існуючих рамок.


16

Також є JPF (Java Plugin Framework) .


Хтось тут використовував JPF? Звучить цікаво
Sven Lilienthal

1
JabRef використовує JPF для своїх плагінів. Працює досить добре.
коппор

Я використовую JPF, але він тісно поєднаний з Ant. Я хочу позбутися цього, але не знаю, який вплив він матиме на мою заявку.
MartinL

Я створив плагін JPF для продукту з відкритим кодом (OpenEMM); Мені вдалося зробити це за допомогою maven (maven-Assembly плагін); Напевно, я дуже ціную простоту розробки, навіть зараз, напевно, більш популярною є OSGI.
рüффп

Чи існують обмеження щодо версій Java для використання JPF?
Мадхав

16

Використовуйте PF4J . Він має підтримку Web, Spring та Wicket. Простий у використанні та складанні додатків


мені здається, що це те, що мені потрібно, і здається, це досить просто, але мені потрібна допомога в цьому
nonybrighto

спробуйте підняти запитання до Decebal на github він допоможе тобі
Даніель Джипа

дивіться meta.stackoverflow.com/questions/376686/… про стан облікового запису Decebals тут
Wolfgang Fahl

1
Якщо ви дивитесь на pf4j, ви також можете подивитися на github.com/hank-cp/sbp . Він побудований поверх pf4j для підтримки Spring Boot для створення повного веб-додатку.
Хенк

13

Я працював над OSGi тиждень - інтенсивний, нічого, крім OSGi тиждень. Врешті-решт це було як поганий сон, але я багато чому навчився.

Мені вдалося змусити OSGi працювати (непросто, усі приклади застаріли, все в мережі не менше трьох років, якщо не п'ять), але у мене виникли серйозні проблеми з інтеграцією в існуючий проект через проблеми банку проявляється.

Коротше кажучи, є лише кілька незрозумілих інструментів, які використовуються для побудови маніфестів, і вони не є добре задокументованими (BND Tools навряд чи є незрозумілим, але він розроблений для певного процесу в Eclipse). Крім того, більшість наявної інформації про OSGi не орієнтована на розробників додатків, які мають існуючий настільний додаток.

Це робить багато контексту для інформації туманним або недоречним. Повідомлення блогу Ніла Бартлетта були найбільшою допомогою, але навіть ті не змогли отримати робочу систему (я схопив якийсь код із підручника Фелікса і склав його разом, щоб отримати вбудовану рамку). Я знайшов його проект книги, який він розмістив безкоштовно років тому, що є чудовим, але приклади в Eclipse не працюють через зміни в підтримці Eclipse OSGi.

Кожен крок - головна перешкода. Я спробую опублікувати ще кілька деталей тут пізніше.


17
Як це відповідь? Це скоріше скандал щодо OSGi, і ви навіть не пояснюєте, що таке OSGi.
Стелс-рабін

@StealthRabbi На час цієї "відповіді", а також деякий час після цього, це була гарна інформація для того, хто намагався працювати з OSGi в дикій природі. OSGi вже був частиною дискусії - тому не потрібно було її визначати. Це відповідь в тому, що це, можливо, врятувало людей тиждень роботи - вся причина для ТА.
Шон Андерсон

9

Я думаю, що рекомендувати OSGi для вирішення вищезазначеної проблеми є вкрай поганою порадою. OSGi - це "правильний вибір", але для сценарію, як описано вище, я вважаю, що JPF або деякі домашні мінімалістичні рамки є достатніми.


3

Роки тому я розпочав такий проект, і, сподіваюся, незабаром буде готовий. Мене надихнули такі проекти, як NetBeans та Eclipse, але тим часом він змінився на щось трохи інше. OSGi зараз виглядає як хороший вибір, але у мене не було можливості порівняти його зі своїм проектом. Він схожий на згаданий вище JPF, але в той же час багато в чому відрізняється.

Основна ідея, яка мене мотивувала, полягає в тому, щоб якомога простіше створити Java-додаток, не розділяючи веб-додатки, додатки для настільних ПК або програми applet / JWS (звичайно це не стосується інтерфейсу користувача - поки що) як основної функціональності.

Я побудував проект, маючи на увазі кілька цілей:

  • не має значення, якщо ви створюєте веб-додаток або настільний додаток, ви повинні запустити програму так само, звичайним основним методом, без фантазії декларації web.xml (не те, що я проти того, щоб мати стандартний веб-дескриптор, але це не добре входить у систему плагінів, де ви додаєте "сервлетів" - я називаю їх RequestHandler (s) - динамічні за вашим бажанням).
  • легко підключити "розширення" навколо "точки розширення" - щось від Eclipse, але інший підхід.
  • самостійно розгортається, оскільки всі плагіни зареєстровані (XML-файли), програма повинна бути самостійно розгорнутою незалежно від системи збирання - звичайно, є завдання Ant і Maven MOJO, які є посиланнями з навколишнім світом, але в в кінці він викликає додаток і доручає йому саморозгортатися у певному місці.
  • запозичений у Maven, він може завантажувати код із сховищ (включаючи сховища Maven 1 & 2), тому ваша програма може бути розгорнута у вигляді однієї невеликої банку, якщо у вас є доступ до сховищ (корисно колись, і в основному це забезпечує підтримку автоматичного оновлення - чи не любите ви ідею повідомляти веб-програмою про те, що існує нова версія, її завантажили, і для її встановлення потрібен лише ваш дозвіл? Я знаю, що це люблю).
  • базовий моніторинг додатків щодо стану системи, сповіщення електронною поштою у разі відмов

2
Я не маю на душі, але ти з цього часу працював? Чи доступний код (я можу його використовувати таким, який є, або додати до нього)?
Пікколо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.