Meilleur moyen de créer un système de plugins avec Java

145

Comment implémenteriez-vous un système de plugins pour votre application Java?

Est-il possible d'avoir un système facile à utiliser (pour le développeur) qui permet d'atteindre les objectifs suivants:

  • Les utilisateurs placent leurs plugins dans un sous-répertoire de l'application
  • Le plugin peut fournir un écran de configuration
  • Si vous utilisez un framework, la licence est-elle compatible avec le développement commercial?
Sven Lilienthal
la source

Réponses:

107

Vous avez d'abord besoin d'une interface que tous les plugins doivent implémenter, par exemple

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

Les auteurs de plugins doivent ensuite regrouper leurs plugins dans des fichiers JAR. Vos applications ouvrent le fichier JAR et peuvent ensuite utiliser un attribut du manifeste JAR ou la liste de tous les fichiers du fichier JAR pour trouver la classe qui implémente votre interface Plugin. Instanciez cette classe, le plugin est prêt à fonctionner.

Bien sûr, vous pouvez également implémenter une sorte de sandboxing afin que le plugin soit limité dans ce qu'il peut et ne peut pas faire. J'ai créé une petite application de test (et j'ai blogué à ce sujet ) qui se compose de deux plugins, dont l'un se voit refuser l'accès aux ressources locales.

Bombe
la source
2
le bac à sable que vous mentionnez est en fait la partie la plus difficile! mais ne vous inquiétez pas - osgi le fait déjà pour vous comme mentionné ci-dessus.
Chii
1
Le bac à sable n'est pas si difficile. Il m'a fallu environ deux semaines pour savoir comment le faire correctement, mais une fois que vous savez que c'est assez simple. :)
Bombe
@Bombe est-ce que cet exemple d'application existe toujours n'importe où?
ataulm
* en utilisant la pièce jointe trouvée sur bugs.freenetproject.org/print_bug_page.php?bug_id=1900
ataulm
@ timberwo7ves Je ne comprends pas ce que vous voulez dire. L'application de test de fichiers peut toujours être téléchargée à partir de l'emplacement indiqué dans l'article et de la page que vous avez mentionnée.
Bombe
41

Utiliser OSGi .

C'est la base du système de plug-in Eclipse. Equinox est l'implémentation d'Eclipse (sous licence EPL) et Felix est l'implémentation du projet Apache (licence publique Apache sous licence).

Eclipse fournit un exemple concret qu'OSGi peut couvrir les points que vous avez mentionnés (ou vous pouvez simplement créer votre application sur Eclipse RCP si vous voulez une pile Eclipse / SWT / JFace complète).

Aaron Maenpaa
la source
4
J'ai essayé OSGi mais je n'ai jamais trouvé de très bonne base pour cela. Ce serait formidable si quelqu'un pouvait recommander des liens ici.
Brian Matthews
1
J'ai intégré l'équinoxe dans mon application et utilisé les pratiques OSGi standard pour faire exactement ce que l'OP veut. En swing aussi, pas SWT. Webstarted également. bonne ressource de départ: neilbartlett.name/blog
basszero
3
OSGi est idéalement le système de plugins de facto. Cependant, le saut du modèle de programmation Java standard au modèle de programmation OSGi est assez large ...
Hendy Irawan
30

Depuis 1.6, il y a eu java.util.ServiceLoader qui peut être utilisé si vous souhaitez coder votre propre système simple.

Mais si vous voulez autre chose que des fonctionnalités de base, utilisez l'un des frameworks existants.

Pete Kirkham
la source
16

Il existe également JPF (Java Plugin Framework) .

Jan
la source
Quelqu'un ici a-t-il utilisé JPF? Cela semble intéressant
Sven Lilienthal
1
JabRef utilise JPF pour ses plugins. Fonctionne assez bien.
koppor le
J'utilise JPF, mais il est étroitement lié à Ant. Je veux m'en débarrasser mais je ne sais pas quel impact cela aura sur mon application.
MartinL
J'ai créé un plugin JPF pour un produit open source (OpenEMM); J'ai pu le faire avec maven (plugin maven-assembly); Bien sûr, j'apprécie vraiment la simplicité du développement même maintenant, c'est probablement OSGI qui est plus populaire.
рüффп
Existe-t-il des restrictions sur les versions Java pour l'utilisation de JPF?
Madhav
16

Utilisez PF4J . Il prend en charge Web, Spring et Wicket. Facile à utiliser et à créer les applications

Mallikarjuna Sangisetty
la source
Je trouve que c'est ce dont j'ai besoin et cela semble assez simple mais j'ai besoin d'aide à ce sujet
nonybrighto
essayez de poser des questions à Decebal sur github. il va vous aider
Daniel Jipa
voir meta.stackoverflow.com/questions/376686/… sur l'état du compte Decebals ici
Wolfgang Fahl
1
Si vous regardez pf4j, vous pouvez également consulter github.com/hank-cp/sbp . Il est construit sur pf4j pour prendre en charge Spring Boot afin de créer une application Web complète.
Hank
13

J'ai travaillé sur OSGi pendant une semaine - une semaine intense, rien que OSGi. À la fin, c'était comme un mauvais rêve mais j'ai beaucoup appris.

J'ai pu faire fonctionner OSGi (pas facile, tous les exemples sont obsolètes, tout sur le net a au moins trois ans sinon cinq), mais j'ai eu de sérieux problèmes pour l'intégrer dans un projet existant en raison de problèmes avec le jar se manifeste.

En bref, il n'y a que quelques outils obscurs utilisés pour construire des manifestes et ils ne sont pas bien documentés (BND Tools n'est guère obscur, mais il est conçu pour un certain processus dans Eclipse). En outre, la plupart des informations OSGi disponibles ne sont pas destinées aux développeurs d'applications disposant d'une application de bureau existante.

Cela rend une grande partie du contexte des informations brumeux ou inapproprié. Les articles de blog de Neil Bartlett ont été la plus grande aide, mais même ceux-ci n'ont pas réussi à obtenir un système fonctionnel (j'ai récupéré du code du didacticiel Felix et l'ai reconstitué pour faire rouler le cadre intégré). J'ai trouvé son brouillon de livre qu'il a publié gratuitement il y a des années, ce qui est excellent, mais les exemples dans Eclipse ne fonctionnent pas à cause des changements apportés au support Eclipse OSGi.

Chaque étape est un obstacle majeur. J'essaierai de publier plus de détails ici plus tard.

Sean Anderson
la source
17
Comment est-ce une réponse? C'est plus une diatribe sur OSGi, et vous n'expliquez même pas ce qu'est OSGi.
Stealth Rabbi
@StealthRabbi Au moment de cette «réponse», et pendant un certain temps après, c'était une bonne information pour quelqu'un qui essayait de travailler avec OSGi dans la nature. OSGi faisait déjà partie de la discussion - il n'était donc pas nécessaire de le définir. C'est une réponse en ce que cela aurait pu sauver des gens une semaine de travail - toute la raison de SO.
Sean Anderson du
9

Je pense que recommander OSGi pour résoudre le problème mentionné ci-dessus est un très mauvais conseil. OSGi est "le bon choix" mais pour un scénario comme celui ci-dessus, je pense que JPF ou un cadre minimaliste local est suffisant.

Steen
la source
3

Il y a des années, j'ai commencé un projet comme celui-là et j'espère qu'il sera bientôt prêt.Je me suis inspiré de projets comme NetBeans et Eclipse, mais entre-temps, cela a changé pour quelque chose d'un peu différent. OSGi semble être un bon choix maintenant, mais je n'ai pas eu l'occasion de le comparer avec mon projet.Il est similaire à JPF mentionné ci-dessus, mais en même temps différent à bien des égards.

L'idée de base qui m'a motivé est d'être aussi simple que possible à créer une application Java, sans séparation entre les applications Web, les applications de bureau ou les applications applet / JWS (bien sûr, cela ne couvre pas encore l'interface utilisateur) en tant que fonctionnalité de base.

J'ai construit le projet avec quelques objectifs en tête:

  • peu importe que vous construisiez une application Web ou une application de bureau, vous devriez démarrer l'application de la même manière, une méthode principale simple, aucune déclaration web.xml fantaisie (non pas que je ne suis pas contre un descripteur Web standard, mais cela ne va pas bien avec un système de plug-in, où vous ajoutez des "servlets" - je les appelle RequestHandler (s) - dynamiques à votre guise).
  • facile à brancher des "extensions" autour d'un "point d'extension" - quelque chose d'Eclipse mais une approche différente.
  • auto-déployable, puisque tous les plugins sont enregistrés (fichiers XML), l'application doit être auto-déployable indépendamment du système de construction - bien sûr il y a une tâche Ant et un Maven MOJO qui sont les liens avec le monde de l'oreide, mais dans le end, il appelle l'application et lui demande de s'auto-déployer à un emplacement spécifique.
  • emprunté à Maven, il peut télécharger du code à partir de référentiels (y compris les référentiels Maven 1 et 2) afin que votre application puisse être déployée comme un seul petit fichier jar tant que vous avez accès aux référentiels (utile parfois, et fondamentalement cela fournit un support pour l'auto- mises à jour - n'aimez-vous pas l'idée d'être averti par votre application Web qu'il existe une version plus récente, elle a été téléchargée et il a juste besoin de votre permission pour l'installer? Je sais que j'aime ça).
  • surveillance de base des applications sur la santé du système, notifications par e-mail en cas de panne
adrian.tarau
la source
2
Je ne veux pas harceler, mais avez-vous travaillé dessus depuis? Le code est-il disponible (je pourrais peut-être l'utiliser tel quel ou y ajouter)?
Piccolo