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.
quelle
Antworten:
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
ClassLoader
oder seinURLClassLoader
wird. 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 .
quelle