Hot-Plugging mit Eclipse RCP und OSGi - JAXenter

Hot-Plugging mit Eclipse RCP und OSGi

Extension Points und Extensions

Bereits vor der Einführung von OSGi verfügte Eclipse über einen Mechanismus, mit dem Plug-ins lose miteinander gekoppelt werden konnten. Dieser Mechanismus besteht aus Erweiterungspunkten (Extension Points) und den zugehörigen Erweiterungen (Extension). Ein Erweiterungspunkt ist dabei vergleichbar mit einer Dienstspezifikation und die Erweiterung mit einer Dienstimplementierung. Dieser Mechanismus konkurriert in gewisser Weise mit den OSGi-Diensten [10], ist aber immer noch aktuell und wird höchstwahrscheinlich auch in den zukünftigen Eclipse-Versionen unterstützt. Ähnlich wie bei OSGi-Diensten werden Erweiterungen und Erweiterungspunkte in einer zentralen Erweiterungsregistratur (Extension Registry) angemeldet und können dort wieder gefunden werden. Im Gegensatz zu OSGi-Diensten müssen Erweiterungspunkte und Erweiterungen mit einem XML-Schema hinterlegt werden, das beschreibt, wie Erweiterungspunkte und Erweiterungen zusammenspielen. Erweiterungspunkte und Erweiterungen können zur Laufzeit in die Erweiterungsregistratur eingefügt und wieder entfernt werden. Dies geschieht durch das Deinstallieren bzw. Installieren entsprechender Plug-ins mit dem Eclipse-internen Update-Mechanismus P2, kann aber auch programmatisch oder über die OSGi-Konsole realisiert werden. Änderungen an der Erweiterungsregistratur können beobachtet werden und ermöglichen es dem Entwickler, bei relevanten Ereignissen einzugreifen (Listing 5).

Listing 5: Beobachten einer Erweiterungsregistratur

  void initExtensionRegistryListener() {
  Platform.getExtensionRegistry().addRegistryChangeListener(
        new IRegistryChangeListener() {
    public void registryChanged(IRegistryChangeEvent event) {
      // do something
    }
  }); 

Zusätzlich zu den Vorgängen in der Erweiterungsregistratur helfen so genannte ExtensionTracker, die zu einer Erweiterung gehörenden Objekte zu beobachten, und ermöglichen das Aufräumen von Objektreferenzen, wenn Erweiterungen entfernt werden. Damit ließe sich theoretisch ein dynamisches Verhalten der Erweiterungspunkte und Erweiterungen realisieren. Neue Funktionalität wie z. B. grafische Oberflächen mit Views und Editoren könnten über diese Mechanismen einer laufenden Anwendung hinzugefügt und auch entfernt werden.

Erweiterungspunkte und Erweiterungen sind Konzepte aus Zeiten, in denen OSGi kein Bestandteil von Eclipse war. In diesen Zeiten spielte die Dynamik in Anwendungen noch keine große Rolle, weshalb Entwickler ihr kaum Beachtung geschenkt haben. Die dynamische Anmeldung von Erweiterungspunkten und Erweiterungen wurde in der Erweiterungsregistratur selten von den Entwicklern beobachtet und die notwendigen Reaktionen auf diese Änderungen im Code kaum behandelt. Selbst in der Eclipse-Plattform wurde diesen Änderungen nicht immer Beachtung geschenkt.

Seit der Einführung von OSGi hat die Eclipse Community stark daran gearbeitet, dynamisches Verhalten für Erweiterungen und Erweiterungspunkte in der Eclipse-Plattform nachträglich einzufügen. Dies ist jedoch auch nach mittlerweile fünf Jahren der Entwicklung noch nicht gänzlich gelungen, weshalb Eclipse nach einer Softwareänderung einen Neustart der IDE empfiehlt. Dieser Nachteil wirkt sich auch auf benutzerdefinierte RCP-Anwendungen aus, da diese auf der Eclipse-Plattform basieren und viele von der Plattform vorgefertigte Erweiterungen nutzen.

Fazit

In einer Eclipse-RCP-Anwendung werden Erweiterungspunkte und Erweiterungen sowie OSGi-Dienste gemeinsam verwendet, was dazu führt, dass jede der vorgestellten Plug-in-Interaktionsmöglichkeiten eigene Herausforderungen beim Hot-Plugging schafft. Sowohl OSGi als auch Eclipse bieten diverse Mechanismen und Helfer, um mit der Dynamik und der sich daraus ableitenden Komplexität umgehen zu können. Trotz all dieser Helfer ist es alles andere als trivial, auch nur annähernd dynamische RCP-Anwendungen zu entwickeln. Hierfür werden fundierte Kenntnisse sowohl in RCP als auch OSGi sowie eine hohe Programmierdisziplin vorausgesetzt. Das gilt nicht nur für einen einzelnen Entwickler, sondern für das gesamte Programmierteam.

Trotz aller Vorsicht und ausgiebiger Tests sind Fehler bei der Entwicklung dynamischer RCP-Anwendungen kaum vermeidbar. Dies liegt nicht zuletzt daran, dass Eclipse durch die fehlerhafte Behandlung von dynamischen Erweiterungspunkten und Erweiterungen selbst für einen Teil dieser Fehler verantwortlich ist. Entwickler sind zusätzlich oft auf die Verwendung von Bibliotheken von Drittherstellern angewiesen. In solchen Fällen ist man als Entwickler kaum in der Lage, den Umgang mit der Dynamik zu beeinflussen, und muss sich auf die Fähigkeiten der Dritthersteller verlassen.

Neben den beschriebenen technischen Herausforderungen existieren noch weitere Problemfelder, die sich nicht so einfach lösen lassen. Bislang sind wir davon ausgegangen, dass in einer dynamischen Eclipse-Umgebung jeder Entwickler die Dynamik einer Anwendung antizipiert und die entsprechenden Maßnahmen ergreift, um damit umgehen zu können. Während diese Annahme bereits in einem kleinen Entwicklerteam schwierig genug aufrechtzuerhalten ist, so erscheint dies noch unrealistischer, wenn wir über große Anwendungen mit großen Projektteams sprechen. Dabei kann es bereits ausreichend sein, wenn eine Komponente oder ein Entwickler die Dynamik in einer Anwendung nicht ausreichend antizipiert, was zu einem Fehlverhalten weiterer Komponenten führen kann.

Echtes Hot-Plugging ist in Eclipse RCP-Anwendungen aufgrund der eingeschränkten Möglichkeiten des Java-Klassenlader-Mechanismus bislang nicht möglich. Verbleibt man in der reinen OSGi-Welt, kann mit einer hohen Programmierdisziplin durch das Starten, Stoppen und Aktualisieren von Bundles im laufenden Betrieb durchaus eine Hot-Plugging-ähnliche Fähigkeit in Anwendungen erreicht werden. In einer Eclipse RCP-Anwendung ist dagegen Hot-Plugging nicht zuverlässig realisierbar. Hier müssen noch Fehler in der Eclipse-Plattform behoben werden, bevor eigene RCP-Anwendungen auf diese Funktionalität aufsetzten können.

Eugen Reiswich ist als Softwareentwickler, Coach und Projektleiter für die C1-WPS GmbH tätig. Sein Schwerpunkt liegt in der Entwicklung verteilter, komponentenbasierter Unternehmensanwendungen mit Eclipse RCP und OSGi.
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.