web-dev-qa-db-fra.com

Le meilleur moyen de construire un système de plugin avec Java

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

Est-il possible d'avoir un système facile à utiliser (pour le développeur) qui réalise les tâches suivantes:

  • 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?
141
Sven Lilienthal

Tout d'abord, vous avez 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 de plug-in. 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é à ce qu'il peut et ne peut pas faire. J'ai créé un petit application de test (et blogué à ce sujet ) composé de deux plugins, dont l'un se voit refuser l'accès aux ressources locales.

102
Bombe

Utilisez OSGi .

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

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

40
Aaron Maenpaa

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

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

29
Pete Kirkham
16
jan

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

13

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

J'ai réussi à faire fonctionner OSGi (pas facile, tous les exemples sont périmés, tout sur le réseau a au moins trois ans, sinon cinq), mais j’ai eu beaucoup de mal à le faire intégrer à un projet existant en raison de problèmes liés à la pot manifeste.

En résumé, seuls quelques outils obscurs sont utilisés pour créer des manifestes et ils ne sont pas bien documentés (BND Tools n’est pas si 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 le contexte de l'information flou ou inapproprié. Les articles de blog de Neil Bartlett ont été d'une aide précieuse, mais même ceux-ci n'ont pas réussi à obtenir un système fonctionnel (j'ai récupéré du code du tutoriel de Felix et je l'ai reconstitué pour que l'infrastructure embarquée démarre). J'ai trouvé le brouillon qu'il avait posté gratuitement il y a des années, ce qui est excellent, mais les exemples fournis dans Eclipse ne fonctionnent pas en raison de modifications apportées à la prise en charge d'Eclipse OSGi.

Chaque étape est un obstacle majeur. Je vais essayer de poster plus de détails ici plus tard.

13
Sean Anderson

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.

9
Steen

Il y a des années, j'ai lancé un projet comme celui-ci et j'espère que tout sera prêt. Je me suis inspiré de projets tels que NetBeans et Eclipse, mais en attendant, le projet a évolué. OSGi semble être un bon choix à présent, mais je n'ai pas eu l'occasion de le comparer à mon projet. Il est similaire au format JPF mentionné ci-dessus, mais diffère également à bien des égards.

L’idée de base qui m’a motivé est d’être aussi simple que possible à construire Java, sans séparation entre les applications Web, les applications de bureau et les applications applet/JWS (bien sûr, cela ne couvre pas la UI - encore) comme une 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 devez démarrer l’application de la même manière, en utilisant une méthode principale simple, pas de déclaration fantaisie web.xml (non pas que je sois 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 "extensions" autour d'un "point d'extension" - quelque chose de Eclipse, mais une approche différente.
  • auto-déployable, étant donné que 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 existe une tâche Ant et un Maven MOJO qui sont les liens avec le monde extérieur, mais dans le end, il appelle l'application et lui demande de se déployer lui-même à 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 & 2) afin que votre application puisse être déployée sous la forme d’un petit fichier jar unique, à condition que vous ayez accès aux référentiels (utile de temps en temps). mises à jour - vous n'aimez pas l'idée d'être averti par votre application Web qu'il existe une version plus récente, qu'elle a été téléchargée et qu'elle nécessite uniquement votre autorisation pour l'installer? Je sais que j'aime ça).
  • surveillance de base des applications sur la santé du système, notifications par courrier électronique en cas de défaillance
3
adrian.tarau