Zuerst benötigen Sie eine Schnittstelle, die alle Plugins implementieren müssen, z
public interface Plugin {
public void load(PluginConfiguration pluginConfiguration);
public void run();
public void unload();
public JComponent getConfigurationPage();
}
Plugin-Autoren sollten ihre Plugins dann in JAR-Dateien bündeln. Ihre Anwendungen öffnen die JAR-Datei und können dann ein Attribut aus dem JAR-Manifest oder die Liste aller Dateien in der JAR-Datei verwenden, um die Klasse zu finden, die Ihre Plugin-Schnittstelle implementiert. Instanziieren Sie diese Klasse, das Plugin ist einsatzbereit.
Natürlich möchten Sie möglicherweise auch eine Art Sandboxing implementieren, damit das Plugin in seinen Möglichkeiten eingeschränkt ist und nicht. Ich habe eine kleine erstellte Testanwendung (und darüber gebloggt ) , die aus zwei Plugins besteht, von denen Zugriff auf lokale Ressourcen verweigert wird.
Verwenden Sie OSGi .
Es ist die Grundlage des Eclipse-Plug-In-Systems. Equinox ist die Implementierung von Eclipse (lizenzierte EPL) und Felix ist die Implementierung des Apache-Projekts (lizenzierte öffentliche Apache-Lizenz).
Eclipse bietet ein konkretes Beispiel dafür, dass OSGi die von Ihnen genannten Punkte abdecken kann (oder Sie können Ihre Anwendung einfach auf Eclipse RCP aufbauen, wenn Sie einen vollständigen Eclipse / SWT / JFace-Stapel wünschen).
quelle
Seit 1.6 gibt es java.util.ServiceLoader, der verwendet werden kann, wenn Sie Ihr eigenes einfaches System codieren möchten.
Wenn Sie jedoch mehr als nur grundlegende Funktionen wünschen, verwenden Sie eines der vorhandenen Frameworks.
quelle
Es gibt auch JPF (Java Plugin Framework) .
quelle
Verwenden Sie PF4J . Es unterstützt Web, Spring und Wicket. Einfach zu bedienen und die Anwendungen zu erstellen
quelle
Ich habe eine Woche an OSGi gearbeitet - eine intensive, nichts als OSGi-Woche. Am Ende war es wie ein böser Traum, aber ich habe viel gelernt.
Ich konnte OSGi zum Laufen bringen (nicht einfach, alle Beispiele sind veraltet, alles im Internet ist mindestens drei Jahre alt, wenn nicht fünf), aber ich hatte aufgrund von Problemen mit dem Betriebssystem ernsthafte Probleme, es in ein bestehendes Projekt zu integrieren Glas manifestiert sich.
Kurz gesagt, es gibt nur wenige undurchsichtige Werkzeuge, die zum Erstellen von Manifesten verwendet werden, und sie sind nicht gut dokumentiert (BND-Werkzeuge sind kaum dunkel, aber für einen bestimmten Prozess in Eclipse konzipiert). Außerdem richten sich die meisten verfügbaren OSGi-Informationen nicht an Anwendungsentwickler, die über eine vorhandene Desktop-Anwendung verfügen.
Dies macht einen Großteil des Kontexts für die Informationen neblig oder unangemessen. Neil Bartletts Blog-Beiträge waren die größte Hilfe, aber selbst diese haben kein funktionierendes System erhalten (ich habe Code aus dem Felix-Tutorial genommen und ihn zusammengesetzt, um das eingebettete Framework ins Rollen zu bringen). Ich habe seinen Buchentwurf gefunden, den er vor Jahren kostenlos veröffentlicht hat, was ausgezeichnet ist, aber die Beispiele in Eclipse funktionieren aufgrund von Änderungen in der Eclipse OSGi-Unterstützung nicht.
Jeder Schritt ist eine große Hürde. Ich werde später versuchen, hier weitere Details zu veröffentlichen.
quelle
Ich denke, dass die Empfehlung von OSGi zur Lösung des oben genannten Problems ein äußerst schlechter Rat ist. OSGi ist "die richtige Wahl", aber für ein Szenario wie das oben genannte halte ich entweder JPF oder ein einheimisches minimalistisches Framework für ausreichend.
quelle
Vor Jahren habe ich ein solches Projekt gestartet und ich hoffe, dass es bald fertig sein wird. Ich habe mich von Projekten wie NetBeans und Eclipse inspirieren lassen, aber in der Zwischenzeit hat sich etwas anderes geändert. OSGi scheint jetzt eine gute Wahl zu sein, aber ich hatte keine Gelegenheit, es mit meinem Projekt zu vergleichen. Es ähnelt dem oben erwähnten JPF, unterscheidet sich aber gleichzeitig in vielerlei Hinsicht.
Die Grundidee, die mich motiviert hat, ist es, Java-Anwendungen so einfach wie möglich zu erstellen, ohne Trennung zwischen Webanwendungen, Desktop-Anwendungen oder Applet / JWS-Anwendungen (natürlich wird die Benutzeroberfläche noch nicht abgedeckt) als Kernfunktionalität.
Ich habe das Projekt mit ein paar Zielen aufgebaut:
quelle