Plugin-System

Status
Nicht offen für weitere Antworten.

MacMallow

Mitglied
Hallo zusammen!

Ich hoffe ich bin hier im richtigen Unterforum. Wenn nicht bitte einfach in das richtige verschieben. Nun aber gleich zum eigentlichen Thema.

Da ich in den nächsten Tagen die Entwicklung einer kleinen Anwendung, die durch Plugins erweitert werden kann, in Angriff nehmen möchte, wollte ich mich diesbezüglich mal etwas schlau machen. Die einzelnen Plugins sollen hierbei ein vorgegebenes Interface implementieren und als jar-Datei in einem Ordner (z.B. "lib) abgelegt werden. Die Anwendung selbst soll nun jede der jar-Dateien nach Implementierungen des Interfaces suchen und diese laden.

Ich habe nun schon auf mehreren Seiten gelesen, dass so ein Plugin-System am besten mit Service Providern zu realisieren ist, jedoch ist mir immer noch nicht klar, wie das ganze funktioniert bzw wie so ein System prinzipiell aufgebaut ist. Daher meine Frage: Könnte jemand bitte ein einfaches Beispiel posten, wie so ein System aussehen könnte bzw. kennt ihr gute Tutorials zu solchen Plugin-Systemen? Ein fertiges Framework wie das JPF scheint mir für meine Ansprüche zu umfangreich zu sein.

Ich weiß, dass dieses Thema schon des öfteren in diversen Foren behandelt wurde, jedoch bin ich aus nichts von dem was ich bisher gelesen habe richtig schlau geworden.

Ich danke euch jetzt schon mal für eure Mühe.

Mac
 
Es gibt einfache OSGi's - welche das können (OSGi ? Wikipedia)
Ansonsten brauchst du einfach einen URLClassLoader, holst dir eine Instanz der Klasse, checkst sie mit instanceof und speicherst sie in einer List oä
 
So...danke für den Tipp, aber ich habs nun doch anders versucht.

Ich habe eine Klasse "MeineImplementierung" geschrieben welches ein Interface "ImeinInterface" implementiert. Das ganze habe ich in eine jar gepackt, in der im META-INF-Ordner ein Ordner namens services liegt. In dieser liegt eine Datei namens "org.test.ImeinInterface" (in diesem Packet liegt mein Interface) und welche die Zeile "org.test.MeineImplementierung" enthält.

In meinem Hauptprogramm frage ich nun mit folgendem Code nach Implementierungen meines Interfaces:
Code:
ServiceLoader<ImeinInterface> loader = ServiceLoader.load(ImeinInterface.class);
		for( ImeinInterface i : loader) {
			i.schreibe(); //eine Methode des Interfaces
		}

Wenn ich die jar nun in Eclipse zum Buildpath hinzufüge, funktioniert das einwandfrei und die Methode wird ausgeführt. Da ich aber nicht weiß, welche und wieviele jar-Dateien ich später verwende, will ich einen Plugin-Ordner zum Classpath hinzufügen, in dem dann meine jar-Dateien liegen. Wie mache ich das? Bis jetzt ist es mir auf diese weiße nur möglich auf Implementierungen zuzugreifen, deren jar-Datei mir schon zu Beginn bekannt sind. Auf jede jar die ich aber später in den Ordner lege habe ich keinen Zugriff.
 
Genau darum benötigst du den von mir erwähnten URLClassLoader Weil diese noch nicht im Classpath und somit der JVM unbekannt sind 😉
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben