2009-01-06 8 views
5

In Java kann ich Klassen Klassenpfad dynamisch hinzufügen und Klassen laden ("dynamisch" bedeutet, ohne meine Anwendung neu zu starten). Gibt es eine bekannte Framework/Library, die sich mit dem dynamischen Laden/Entladen von Modulen ohne Neustart befasst?Dynamisches Laden von Modulen in Java

Die übliche Einrichtung, insbesondere für Web-Anwendungen, ist Load Balancer, mehrere Instanzen der Anwendung und schrittweise Bereitstellung und Neustart der neuen Version. Ich suche nach etwas anderem - Anwendung mit mehreren Diensten/Plugins, möglicherweise Single-Instance-Desktop-Anwendung, wo die Deaktivierung einzelner Service ist billig, aber Herunterfahren oder Neustarten der vollständigen Anwendung ist nicht machbar.

Ich denke über eine typische Plugin-Infrastruktur nach, in der Plugins ohne Neustart der Anwendung aktualisiert oder installiert werden können. Muss ich das von Grund auf programmieren oder ist etwas schon vorhanden? Federkompatibel und opensource ist ein Plus, aber keine Voraussetzung.

Antwort

9

Sie könnten Ihre Federanwendung in einem OSGI framework ausführen.

ich glaube, das DMServer ein Modul-basierte Java-Anwendungsserver, der Enterprise-Java-Anwendungen und Spring betriebene Anwendungen ausführen ausgelegt ist, basierend auf OSGI

Sie können weitere Informationen in diesem Hello, OSGi, Part 2: Introduction to Spring Dynamic Modules Artikel finden, vor allem, wie Verwenden von Spring DM zum dynamischen Installieren, Aktualisieren und Deinstallieren von Modulen in einem laufenden System


Hinweis: Wenn Sie sprechen „Plugins können ohne Neustart Anwendung aktualisiert oder installiert werden“, ist OSGI der erste Kandidat Framework, das in den Sinn kommt.

Es geht um die Modularisierung von Anwendungen in kleinere Bündel.
Jedes Bundle ist eine eng gekoppelte, dynamisch ladbare Sammlung von Klassen, Jars und Konfigurationsdateien, die explizit ihre externen Abhängigkeiten angeben (falls vorhanden).

3

Der vielleicht einfachste Ansatz besteht darin, jedes Plugin mit seinem eigenen Klassenlader zu laden. Verwerfen Sie dann den Klassenlader und erstellen Sie einen neuen, um das Plugin neu zu laden. Sie werden wollen, init() und destroy() Methoden in der Plugin-API, um eine Chance für Start/Herunterfahren geben Funktionalität.

Dies hat auch den Vorteil, die Plugins voneinander zu isolieren.

Ein URLClassLoader ist Ihr Ausgangspunkt dafür. Die allgemeine Idee ist, dass Sie eine XxxPlugin-Oberklasse bereitstellen, die alle Unterklassen von Plugins enthält. Betrachten Sie das Beispiel von Applet, das im Wesentlichen ein GUI-Plugin (oder Midlet, usw.) ist.

Verwandte Themen