Comment créer un programme Java pluginable?


Je veux créer un programme Java qui peut être étendu avec des plugins. Comment puis-je faire cela et où dois-je chercher?

J'ai un ensemble d'interfaces que le plugin doit implémenter, et il devrait être dans un jar. Le programme doit surveiller les nouveaux fichiers jar dans un dossier relatif (au programme) et les enregistrer d'une manière ou d'une autre.


Bien que j'aime Eclipse RCP, je pense que c'est trop pour mes besoins simples.

Même chose pour le printemps, mais puisque j'allais le regarder de toute façon, je pourrais aussi bien essayer.

Mais quand même, je préférerais trouver un moyen de créer mon propre plugin "framework" aussi simple que possible.

Author: Kev, 2008-08-25

6 answers

Je l'ai fait pour un logiciel que j'ai écrit dans le passé, c'est très pratique. Je l'ai fait en créant d'abord une interface que toutes mes classes de "plugin" devaient implémenter. J'ai ensuite utilisé le Java ClassLoader pour charger ces classes et en créer des instances.

Une façon de procéder est la suivante:

File dir = new File("put path to classes you want to load here");
URL loadPath = dir.toURI().toURL();
URL[] classUrl = new URL[]{loadPath};

ClassLoader cl = new URLClassLoader(classUrl);

Class loadedClass = cl.loadClass("classname"); // must be in package.class name format

Qui a chargé la classe, vous devez maintenant en créer une instance, en supposant que le nom de l'interface est MyModule:

MyModule modInstance = (MyModule)loadedClass.newInstance();
 40
Author: Steve M, 2013-11-26 05:23:57

Regardez dansOSGi .

D'une part, OSGi fournit toutes sortes d'infrastructures pour gérer, démarrer et faire beaucoup d'autres choses avec des composants logiciels modulaires. D'autre part, il pourrait m'trop lourd pour vos besoins.

Incidemment, Eclipse utilise OSGi pour gérer ses plugins.

 17
Author: David Koelle, 2008-08-25 14:09:53

Je vous recommande de regarder de près l'API Java Service Provider (SPI) . Il fournit un système simple pour trouver toutes les classes dans tous les fichiers Jar du chemin de classe qui s'exposent comme implémentant un service particulier. Je l'ai utilisé dans le passé avec des systèmes de plugins avec beaucoup de succès.

 15
Author: jsight, 2013-11-26 05:23:09

Bien que je confirme la solution acceptée, si un support de plugin de base est nécessaire (ce qui est le cas la plupart du temps), il y a aussi le Java Plugin Framework (JPF) qui, bien que manquant de documentation appropriée, est une implémentation de framework de plugin très soignée.

Il est facilement déployable et - lorsque vous passez par les idiosynchrasies de chargement de classe - très facile à développer. Un commentaire à ce qui précède est d'être conscient que plugin loadpaths sous le répertoire plugin doit être nommé après le chemin de classe complet en plus d'avoir ses fichiers de classe déployés dans un chemin de package normal nommé path. Par exemple

plugins
`-com.my.package.plugins
  `-com
    `-my
      `-package
        `-plugins
          |- Class1.class
          `- Class2.class
 6
Author: Steen, 2008-12-20 21:47:15

À l'approche de classloader maison: Bien que ce soit certainement un bon moyen d'en apprendre davantage sur les classloaders, il y a quelque chose appelé "classloader hell", principalement connu par les gens qui ont lutté avec lui quand il s'agit d'utiliser dans de plus grands projets. Les classes conflictuelles sont faciles à introduire et difficiles à résoudre.

Et il y a une bonne raison pour laquelle eclipse a fait le déplacement à OSGi il y a des années. Donc, si c'est plus qu'un projet pour animaux de compagnie, jetez un œil sérieux à OSGi. Sa peine de regarder. Vous en apprendrez plus sur classloaders PLUS une norme technologique émergente.

 4
Author: Toni Menzel, 2014-05-13 07:30:06

Avez-vous envisagé de construire au-dessus de la plate-forme Client riche d'Eclipse, puis d'exposer le framework d'extension Eclipse?

De plus, en fonction de vos besoins, le framework Spring peut vous aider avec cela et d'autres choses que vous pourriez vouloir faire: http://www.springframework.org/

 1
Author: John with waffle, 2008-08-24 23:38:08