Wie kann ich neue JARs einbinden, die eine Schnittstelle dynamisch implementieren?

7

Kurzer Hintergrund: Ich arbeite an der Entwicklung einer Schnittstelle, die von mir und anderen Entwicklern implementiert wird. Über diese Schnittstelle können Benutzer neuen Funktionscode zur neuen Verwendung in ein System "einstecken". Dieser neue Code wird von einem bereits laufenden Server / einer bereits laufenden Anwendung aufgerufen. (TLDR: Ich muss die Fähigkeit entwickeln, Plugins im laufenden Betrieb in meiner Anwendung zu installieren.)

Alle Arbeiten, die ich bisher mit Schnittstellen durchgeführt habe, waren für interne Codierungszwecke gedacht, um nicht nach außen gerichtet zu werden. Die einzige Möglichkeit, die ich mir vorstellen kann, um Benutzern das Einfügen neuer Code-Implementierungsschnittstellen zu ermöglichen, besteht darin, dass der Benutzer eine JAR-Datei mit der implementierenden Klasse verknüpft und deren Klassensignatur für den Aufruf definiert. Dies scheint etwas zu sein, was schon einmal gemacht wurde. Ich war einfach noch nie mit der Codierungsseite konfrontiert.

Gibt es ein Framework, mit dem ich dieses Plugin für neuen Java-Code zur Laufzeit von Servern / Anwendungen zulassen kann? Ich habe bereits APIs verwendet, aber in mehr Webdiensten wird deutlich, wo Sie einen Dienst nutzen und keine Kernschnittstelle "implementieren".

Als Referenz verwende ich ein Java-Backend mit Spring als Hauptanwendung.

Wände
quelle
1
Sieht aus wie ein Duplikat von stackoverflow.com/questions/25449/…
Esben Skov Pedersen
@EsbenSkovPedersen, das mich in ein Kaninchenloch führte, das mir schließlich alles gab, was ich brauchte und noch mehr. Vielen Dank. (-admins: Duplizieren, schließen ist in Ordnung von mir)
Wände
@ Wall-Duplikate müssen sich auf derselben Site befinden. Nur weil SO eine ähnliche Frage hat, heißt das nicht, dass diese ein Duplikat davon ist. Sie können zusammenfassen, was Sie in einer Antwort auf diese Frage gefunden haben, und einen Link zur SO-Frage erstellen, da die Antworten etwas dauerhafter sind als Kommentare.

Antworten:

5

Nachdem ich mir einen verwandten Beitrag zu Stack Overflow angesehen hatte , stellte ich fest, dass mir verschiedene Tools zur Verfügung stehen, um die Entwicklung im "Plugin" -Stil durchzuführen.

Zuerst war ich mit "API" nah dran, aber die richtige Lösung ist eine "SPI" - oder Service Provider-Schnittstelle. Ich habe einen sehr guten Beitrag gefunden, der den Unterschied beim Stapelüberlauf beschreibt . Zusammenfassend: API ist eine Reihe von Klassen / Schnittstellen / Methoden, die Sie aufrufen und verwenden, um ein Ziel zu erreichen. Im Vergleich zu einem SPI, bei dem es sich um eine Reihe von Klassen / Schnittstellen / Methoden handelt, die Sie erweitern und implementieren, um ein Ziel zu erreichen.

Es gibt viele Möglichkeiten, nach denen ich noch suche, um die richtige Lösung für mich zu finden, aber es scheint, dass die Verwendung von Java der richtige Weg ist ClassLoaderoder sein URLClassLoaderwird. Oracle bietet eine große Anleitung, wie dies zu implementieren hier .

Es gibt viele Tools, die dies unterstützen können, wie Apache Aries und OSGi .

Wände
quelle