Najlepszy sposób na zbudowanie systemu wtyczek w Javie

Jak zaimplementowałbyś system wtyczek do swojej aplikacji Java?

Czy jest możliwe posiadanie łatwego w obsłudze (dla programisty) systemu, który osiąga:

  • użytkownicy umieszczają swoje wtyczki w podkatalogu aplikacji
  • wtyczka może dostarczyć ekran konfiguracji
  • Jeśli używasz frameworka, czy licencja jest zgodna z komercyjnym rozwojem?
Author: Marcus Leon, 2009-01-21

8 answers

Najpierw potrzebujesz interfejsu, który wszystkie wtyczki muszą zaimplementować, np.

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

Autorzy wtyczek powinni następnie spakować swoje wtyczki do plików JAR. Twoje aplikacje otwierają plik JAR i mogą użyć atrybutu z manifestu jar lub listy wszystkich plików w pliku JAR, aby znaleźć klasę, która implementuje interfejs wtyczki. Utwórz instancję tej klasy, wtyczka jest gotowa do pracy.

Oczywiście możesz także zaimplementować jakiś rodzaj sandboxingu, aby wtyczka była ograniczone w tym, co może, a czego nie może zrobić. Stworzyłem małą aplikację testową (i blogowane o niej), która składa się z dwóch wtyczek, z których jedna jest pozbawiona dostępu do lokalnych zasobów.

 95
Author: Bombe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-19 12:14:35

Użyj OSGi .

Jest podstawą systemu wtyczek Eclipse. Equinox jest implementacją Eclipse (licencjonowany EPL), a Felix jest implementacją projektu Apache (licencjonowany Apache Public License).

Eclipse dostarcza konkretnego przykładu, że OSGi może pokryć punkty, o których wspomniałeś (lub możesz po prostu zbudować swoją aplikację na Eclipse RCP jeśli chcesz mieć pełny stos Eclipse/SWT/JFace).

 41
Author: Aaron Maenpaa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-03 09:21:14

Od 1.6 istnieje java.util.ServiceLoader , który może być użyty, jeśli chcesz zakodować własny prosty system.

Ale jeśli potrzebujesz czegoś więcej niż podstawowych funkcji, użyj jednej z istniejących frameworków.

 29
Author: Pete Kirkham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-09 05:16:07

Istnieje również JPF (Java Plugin Framework).

 16
Author: jan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-09 09:14:26

Pracowałem nad OSGi przez tydzień -- intensywny, nic innego jak tydzień OSGi. Pod koniec było to jak zły sen, ale wiele się nauczyłem.

Udało mi się uruchomić OSGi (nie jest łatwo, wszystkie przykłady są nieaktualne, wszystko w sieci ma co najmniej trzy lata, jeśli nie pięć), ale miałem poważny problem z zintegrowaniem go z istniejącym projektem z powodu problemów z manifestami jar.

Krótko mówiąc, istnieje tylko kilka niejasnych narzędzi używanych do budowania manifestów i nie są dobrze udokumentowane (BND Tools jest mało niejasne, ale jest przeznaczony do pewnego procesu w Eclipse). Ponadto większość dostępnych informacji OSGi nie jest skierowana do twórców aplikacji, którzy mają istniejącą aplikację komputerową.

To sprawia, że kontekst informacji jest mglisty lub nieodpowiedni. Posty na blogu Neila Bartletta były największą pomocą, ale nawet tym nie udało się uzyskać działającego systemu (chwyciłem trochę kodu z samouczka Felixa i poskładałem go do kupy, aby uzyskać embedded Framework). Znalazłem jego szkic książki, który opublikował za darmo lata temu, co jest doskonałe, ale przykłady w Eclipse nie działają ze względu na zmiany w obsłudze OSGi Eclipse.

Każdy krok to poważna przeszkoda. Postaram się zamieścić więcej szczegółów tutaj później.

 13
Author: Sean Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-14 15:17:06

Myślę, że rekomendowanie OSGi do rozwiązania wyżej wymienionego problemu jest bardzo słabą radą. OSGi jest "właściwym wyborem", ale dla scenariusza jak ten powyżej, myślę, że albo JPF lub jakiś domowy minimalistyczny framework jest wystarczający.

 9
Author: Steen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-29 18:24:59

Użyj PF4J. Posiada wsparcie dla Web, Spring i Wicket. Łatwy w użyciu i budowie aplikacji

 9
Author: Mallikarjuna Sangisetty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-24 14:12:57

Lata temu rozpocząłem taki projekt i mam nadzieję, że wkrótce będzie gotowy.Zainspirowały mnie projekty takie jak NetBeans i Eclipse, ale w międzyczasie zmieniło się to na coś nieco innego. OSGi wygląda teraz na dobry wybór, ale nie miałem okazji porównać go z moim project.It jest podobny do wspomnianego wyżej JPF, ale w tym samym czasie różni się pod wieloma względami.

Podstawową ideą, która mnie zmotywowała, jest jak najprostsze zbudowanie aplikacji Java, bez rozdzielania między aplikacje webowe, desktopowe lub aplikacje aplet/JWS (oczywiście nie obejmuje to jeszcze interfejsu użytkownika) jako podstawowej funkcjonalności.

Zbudowałem projekt z kilkoma celami w głowie:

  • nie ma znaczenia, czy budujesz aplikację webową, czy desktopową, powinieneś uruchomić aplikację w ten sam sposób, zwykłą główną metodą, bez wymyślnej sieci.deklaracja xml(nie to, że jestem przeciwny standardowemu deskryptorowi www, ale nie idzie to dobrze z systemem plug-in, gdzie dodaj "serwlety" - nazywam je RequestHandler ( s) - dynamiczne do twojej woli).
  • łatwe do podłączenia "extensions" wokół "extension point" - coś z Eclipse, ale inne podejście.
  • self-deployable, ponieważ wszystkie wtyczki są zarejestrowane (pliki XML) aplikacja musi być self-deployable niezależnie od systemu budowania - oczywiście istnieje zadanie Ant i Maven MOJO, które są łącznikami ze światem ourside, ale w końcu wywołuje aplikację i instruuje ją, aby samodzielne wdrożenie się w określonym miejscu.
  • pożyczony od Mavena, może pobierać kod z repozytoriów (w tym z repozytoriów Maven 1 i 2), dzięki czemu Twoja aplikacja może być wdrożona jako pojedynczy mały jar, o ile masz dostęp do repozytoriów (przydatny kiedyś, a w zasadzie zapewnia wsparcie dla automatycznych aktualizacji-nie podoba ci się pomysł, aby być powiadamianym przez Twoją aplikację internetową, że istnieje nowsza wersja, została pobrana i potrzebuje tylko Twojej zgody, aby ją zainstalować? I know I uwielbiam to).
  • podstawowe monitorowanie aplikacji o kondycji systemu, powiadomienia e-mail w przypadku awarii
 3
Author: adrian.tarau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-23 14:03:41