Question

Je souhaite créer un programme Java pouvant ê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 pot.Le programme doit rechercher de 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 simples besoins.

Même chose pour Spring, mais comme j'allais le regarder de toute façon, autant l'essayer.

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

Était-ce utile?

La solution

J'ai fait cela pour des logiciels que j'ai écrits dans le passé, c'est très pratique.Je l'ai fait en créant d'abord une interface que toutes mes classes de « plugins » devaient implémenter.J'ai ensuite utilisé Java Chargeur de classe 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

Cela 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();

Autres conseils

Examiner OSGi.

D'une part, OSGi fournit toutes sortes d'infrastructures pour gérer, démarrer et effectuer bien d'autres choses avec des composants logiciels modulaires.Par contre, il pourrait être trop lourd pour vos besoins.

D'ailleurs, Eclipse utilise OSGi pour gérer ses plugins.

Je vous recommande de regarder de près l'API du fournisseur de services Java (SPI).Il fournit un système simple pour rechercher toutes les classes de tous les Jars 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.

Bien que j'appuie la solution acceptée, si un support de plugin de base est nécessaire (ce qui est le cas la plupart du temps), il existe également le Cadre de plugins Java (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 - une fois que vous avez surmonté les particularités du chargement de classes - très facile à développer.Un commentaire sur ce qui précède est de savoir que les chemins de chargement des plugins situés sous le répertoire du plugin doivent être nommés d'après le complet classpath 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

Avec l'approche du chargeur de classe local :Bien que ce soit certainement un bon moyen d'en apprendre davantage sur les classloaders, il existe quelque chose appelé "l'enfer des classloaders", surtout connu des personnes qui ont lutté avec lui lorsqu'il s'agit de l'utiliser dans des projets plus importants.Les classes conflictuelles sont faciles à introduire et difficiles à résoudre.

Et il y a une bonne raison pour laquelle Eclipse a migré vers OSGi il y a des années.Donc, s’il s’agit plus d’un projet favori, jetez un œil sérieux à OSGi.Cela vaut la peine d'être regardé.Vous découvrirez les classloaders PLUS une norme technologique émergente.

Avez-vous envisagé de construire sur la plateforme client riche d'Eclipse, puis d'exposer le framework d'extension Eclipse ?

De plus, en fonction de vos besoins, Spring Framework peut vous aider avec cela et d'autres choses que vous voudrez peut-être faire : http://www.springframework.org/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top