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:
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.
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).
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.
Il y a aussi JPF (Java Plugin Framework) .
Utilisez PF4J . Il prend en charge Web, Spring et Wicket. Facile à utiliser et à construire les applications
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.
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.
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: