Frage

Ich möchte ein Java-Programm erstellen, die mit Plugins erweitert werden kann. Wie kann ich das tun und wo soll ich achten?

Ich habe eine Reihe von Schnittstellen, die das Plugin implementieren müssen, und es sollte in einem Glas sein. Das Programm sollte für neue Gläser in einer relativen beobachten (zum Programm) Ordner und registriert sie irgendwie.


Obwohl ich wie Eclipse RCP tun, ich denke, es für meine einfachen Bedürfnisse zu viel ist.

Das Gleiche gilt für den Frühling, aber da ich es ohnehin aussehen würde, könnte ich auch versuchen Sie es.

Aber immer noch, würde ich es vorziehen, einen Weg zu finden, um meinen eigenes Plugin „Rahmen“ so einfach wie möglich zu gestalten.

War es hilfreich?

Lösung

Ich habe dies für Software getan, was ich in der Vergangenheit geschrieben habe, ist es sehr praktisch. Ich habe es getan, indem man zuerst eine Schnittstelle zu schaffen, die alle meine ‚Plugin‘ Klassen benötigt zu implementieren. Ich habe dann verwendet die Java Classloader diejenigen zu laden Klassen und erstellen Instanzen von ihnen.

Eine Möglichkeit, darüber gehen kann, ist dies:

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

hat, dass die Klasse geladen, jetzt müssen Sie eine Instanz davon erstellen, den Namen der Schnittstelle unter der Annahme MyModule:

MyModule modInstance = (MyModule)loadedClass.newInstance();

Andere Tipps

Schauen Sie in OSGi .

Auf der einen Seite bietet OSGi alle Arten von Infrastruktur für die Verwaltung, Starten und viele andere Dinge mit modularen Software-Komponenten zu tun. Auf der anderen Seite, könnte es mich zu schwer Gewicht für Ihre Bedürfnisse.

Übrigens Eclipse verwendet OSGi seine Plugins zu verwalten.

Ich empfehle Ihnen, einen genauen Blick auf die nehmen Java Service Provider (SPI) API . Es bietet ein einfaches System für alle Klassen in allen Gläser auf dem Classpath zu finden, die sich als die Implementierung eines bestimmten Dienstes aussetzen. Ich habe es in der Vergangenheit mit Plugin-Systemen mit großem Erfolg eingesetzt.

Obwohl ich werde zweite die akzeptierte Lösung, wenn eine grundlegende Plugin-Unterstützung benötigt wird (was der Fall ist die meiste Zeit), auch die ist Java Plugin Framework- (JPF), die zwar eine ordnungsgemäße Dokumentation fehlt, eine sehr ordentliche Plugin-Framework-Implementierung ist.

Es ist leicht einsetzbar und - wenn man sich den Classloading idiosynchrasies durchkommen - sehr einfach zu entwickeln, mit. Ein Kommentar zu den oben ist sich dessen bewusst zu sein, dass Plugin loadpaths unter dem Plugin-Verzeichnis nach dem genannt werden müssen voll Classpath zusätzlich zu seinen Klassendateien in einem normalen Paketpfad namens Pfad eingesetzt hat. Z.

plugins
`-com.my.package.plugins
  `-com
    `-my
      `-package
        `-plugins
          |- Class1.class
          `- Class2.class

Auf dem home-grown-Classloader-Ansatz: Während sein definitiv ein guter Weg, um Classloader zu lernen, etwas „Classloader Hölle“, vor allem bekannt durch die Menschen, die mit ihm gerungen, wenn es darum geht, zu verwenden, bei größeren Projekten genannt wird. In Konflikt stehende Klassen sind einfach einzuführen und zu schwer zu lösen.

Und es gibt einen guten Grund, warum Eclipse vor dem Umzug in OSGi Jahren. Also, wenn sie mehr als ein Haustier Projekt, nimmt einen ernsten Blick in OSGi. Es lohnt sich ein Blick auf. Sie werden über Classloader lernen PLUS aufstrebender technolgy Standard.

Haben Sie darüber nachgedacht, Gebäude auf der Rich Client Platform von Eclipse, und dann Aussetzen der Eclipse-Erweiterung Framework?

Auch je nach Bedarf könnte die Spring Framework mit diesem und anderen Dingen helfen Sie tun möchten vielleicht: http : //www.springframework.org/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top