2008-08-24 8 views
30

Ich möchte ein Java-Programm erstellen, das mit Plugins erweitert werden kann. Wie kann ich das tun und wo sollte ich suchen?Wie erstelle ich ein Plugin-fähiges Java-Programm?

Ich habe eine Reihe von Schnittstellen, die das Plugin implementieren muss, und es sollte in einem Jar sein. Das Programm sollte nach neuen JARs in einem relativen (zum Programm) Ordner suchen und sie irgendwie registrieren.


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

Das gleiche gilt für den Frühling, aber da ich es mir sowieso ansehen würde, könnte ich es auch mal versuchen.

Aber ich würde immer noch lieber einen Weg finden, um mein eigenes Plugin "Framework" so einfach wie möglich zu erstellen.

+0

möglich Duplikat [Beste Art und Weise ein Plugin-System mit Java zu bauen] (http://stackoverflow.com/questions/465099/best-way-to-build-a-plugin-system-with-java). Dies ist früher, aber der andere wurde am Ende beliebter. –

Antwort

37

ich dies für Software gemacht habe ich in der Vergangenheit geschrieben habe, ist es sehr praktisch, . Ich habe es gemacht, indem ich zuerst ein Interface erstellt habe, das alle meine 'plugin' Klassen implementieren müssen. Ich habe dann Java ClassLoader verwendet, um diese Klassen zu laden und Instanzen von ihnen zu erstellen.

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 

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

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

Ich weiß, ich bin ein wenig zu spät in diesem Thread, aber was ist, wenn Sie alle gegebenen Klassen in einem Verzeichnis durchlaufen und laden möchten? Gibt es irgendwo eine funktionierende Implementierung und Code online? Ansonsten verstehe ich die meisten von Ihnen Code und es ist sehr einfach, danke! +1 –

+1

@CodyRichardson Es gibt ein vollständiges Beispiel einer einfachen Implementierung unter http://www.knowbase.org/viewtopic.php?id=31; Es verwendet Java 8 und Gradle 4. – Alexiy

+0

@Alexiy Danke für diesen Link, es hat mir sehr geholfen und ist im Grunde alles, was ich brauchte. Es war anfangs etwas kompliziert (hauptsächlich die Lambdas), aber das ist nur, weil ich ein Java-Noob bin :) Ich habe es ein paar Mal durchgesehen und es machte viel mehr Sinn. Dank dafür! –

1

Haben Sie darüber nachgedacht, auf der Rich-Client-Plattform von Eclipse aufzubauen und dann das Eclipse-Erweiterungs-Framework verfügbar zu machen?

auch je nach Bedarf könnte die Spring Framework helfen mit, dass und andere Dinge, die Sie tun mögen: http://www.springframework.org/

14

Ich empfehle Ihnen, the Java Service Provider (SPI) API genau unter die Lupe zu nehmen. Es bietet ein einfaches System zum Auffinden aller Klassen in allen Klassen des Klassenpfads, die sich selbst als Implementierung eines bestimmten Dienstes aussetzen. Ich habe es in der Vergangenheit mit Plugin-Systemen mit großem Erfolg verwendet.

+2

Beachten Sie, dass die Klasse sun.misc.Service durch die Klasse java.util.ServiceLoader ersetzt wurde. –

16

Blick in OSGi.

Auf der einen Seite bietet OSGi alle Arten von Infrastruktur für die Verwaltung, Start und viele andere Dinge mit modularen Softwarekomponenten. Auf der anderen Seite könnte es mir für Ihre Bedürfnisse zu schwer werden.

Übrigens verwendet Eclipse OSGi, um seine Plugins zu verwalten.

+1

+1 für OSGi. Ich finde es die richtige Größe zwischen einfachen ClassLoader-Tricks (die Ihnen viele neue Ideen geben werden) und Eclipse RCP (großes Framework für nicht so komplexe Aufgaben). – Leonel

4

Auf dem selbst entwickelten Classloader-Ansatz: Während es definitiv eine gute Möglichkeit ist, über Classloaders zu lernen, gibt es etwas namens "classloader hell", vor allem von Leuten, die damit rangen, wenn es um größere Projekte geht. Widersprüchliche Klassen sind leicht einzuführen und schwer zu lösen.

Und es gibt einen guten Grund, warum Eclipse vor Jahren zu OSGi wechselte. Also, wenn es mehr als ein Haustier Projekt ist, nehmen Sie einen ernsthaften Blick in OSGi. Es lohnt sich anzuschauen. Sie lernen über Classloader PLUS einen aufstrebenden Technologiestandard.

6

Obwohl ich die akzeptierte Lösung, wenn eine grundlegende Plugin-Unterstützung benötigt wird (was der Fall die meiste Zeit) ist, gibt es auch die Java Plugin Framework (JPF), die, obwohl fehlende ordnungsgemäße Dokumentation, ist eine sehr ordentlich Plugin-Framework-Implementierung.

Es ist leicht einsetzbar und - wenn Sie durch die Classloading-Idiosynkrasien kommen - sehr einfach zu entwickeln. Ein Kommentar zu dem oben genannten ist zu beachten, dass Plugin-Ladepfade unterhalb des Plugin-Verzeichnisses nach dem vollen Klassenpfad benannt werden müssen, zusätzlich dazu, dass seine Klassendateien in einem normalen Paketpfad mit dem Namen path deployed werden. Z.B.

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