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.
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).
la source
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.
la source
Il existe également JPF (Java Plugin Framework) .
la source
Utilisez PF4J . Il prend en charge Web, Spring et Wicket. Facile à utiliser et à créer les applications
la source
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.
la source
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.
la source
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:
la source