Von alten Konsolen, Affen und seltsamen Schleifen

Seltsame Schleifen

Um unsere Erweiterung in eine Equinox Runtime zu installieren und zu testen, stehen uns verschiedene Möglichkeiten zur Verfügung:

  • Starten unseres Projekts als Eclipse Application (RUN AS | ECLIPSE APPLICATION). Die OSGi-Konsole in dieser Instanz öffnen und das Kommando ausführen.
  • Erstellung einer minimalen Launch-Konfiguration, die nur die Equinox Runtime und unser Bundle enthält. Start des Frameworks mit dem -console Switch. So wird die Konfiguration headless in der Konsole gestartet.
  • Export unseres Projekts als OSGi Bundle (EXPORT | DEPLOYABLE PLUG-INS AND FRAGMENTS) und Installation dieses Bundles in die laufende IDE.
  • Direkte Installation des Projekts im Workspace als Bundle in die laufende IDE.

Die erste Variante ist langsam und ressourcenintensiv, da eine vollständige Workbench gestartet und initialisiert werden muss. Die zweite Variante verkürzt die Startzeit und damit unseren Build-Deploy-Testzyklus schon deutlich. Diese Herangehensweise ist für die tägliche Arbeit gut geeignet, da Entwicklungsumgebung und zu testendes Artefakt sauber getrennt sind und die Testinstanz im Debug-Modus gestartet werden kann.

Wir können aber auch die Dynamik von OSGi ausnutzen und unser neues Bundle direkt in die OSGi Runtime, aus der auch unsere Eclipse Workbench läuft, installieren. Variante drei ist der idiomatischste Ansatz, um das zu erreichen. Es geht aber noch pragmatischer: Da in unserem Projektordner neben den Sourcen auch die kompilierten Klassen liegen und die Verzeichnisstruktur ansonsten der des exportierten Bundles gleicht, können wir das Bundle auch direkt aus dem Workspace laden. Dieser Ansatz fällt sicherlich in die Kategorie „dirty hack“, illustriert aber hervorragend die Dynamik und Flexibilität von OSGi. Wenn Sie keine eigenständige Applikation, sondern Erweiterungen zur Eclipse Workbench entwickeln, ist diese Herangehensweise jedoch tatsächlich hilfreich. In jedem Fall tun wir gut daran, uns an die Warnung vom Anfang des Artikels zu erinnern: „WARNING: This console is connected to the current running instance of Eclipse!“ Alle Warnungen in den Wind schlagend nehmen wir das bin/-Verzeichnis in der Datei MANIFEST.MF in den Bundle Classpath auf:

...
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: ./, bin/

Um das Bundle installieren zu können, müssen wir den Ablageort des Projekts auf der Platte kennen. Über die Resource Properties des Projekts ist der Pfad schnell nachgeschlagen: Wir wählen das Projekt im PACKAGE EXPLORER aus, drücken Alt-Enter und wählen den RESOURCE-Knoten im PROPERTIES-Dialog aus. Der Wert der Property Location ist der physikalische Pfad.

Wir öffnen wieder das CONSOLE View und prüfen als Erstes mit dem Befehl ss <Teil des Bundle Symbolic Names>, ob unser Bundle bereits installiert ist. Das ist es nicht, also installieren wir es mit dem Befehl install <URL des Projekts>. Wenn wir jetzt unser Kommando check aufrufen . bekommen wir die Hilfetexte angezeigt. Warum? Wir haben das Bundle noch nicht gestartet. Rufen wir also start <bundle id> mit der ID auf, die das install-Kommando zurückgegeben hat auf. Dann versuchen wir es noch einmal, und siehe da: Unser Test wird ausgeführt. Auch die Hilfe enthält jetzt die Beschreibung unseres Kommandos.

Listing 5
osgi> ss osgiconsole
Framework is launched.
id	State       Bundle

osgi> install  file:///D:/.../net.wolfgangwerner.tutorials.osgiconsole
Bundle id is 208

osgi> start 208

osgi> check
badTest(net.wolfgangwerner.tutorials.osgiconsole.test.Tests): Sweet guinea pig of Winnipeg! How did that happen?

osgi> help
...
--- Integrity Checks ---
  check - Runs some integrity tests and displays failures if any
...

Damit haben wir ein sich in der Entwicklung befindliches Bundle direkt als Komponente in das verwendete Entwicklungswerkzeug installiert und damit eine Seltsame Schleife [10] gebunden.

Seltsame Schleifen

Der Begriff „Seltsame Schleife“ wurde von Douglas R. Hofstadter in seinem Buch Gödel, Escher, Bach [10] geprägt. Er beschreibt eine Selbstbezüglichkeit innerhalb einer Hierarchie, bei dem Hierarchieebenen übersprungen werden, sodass man sich bei der Betrachtung immer wieder am Ausgangspunkt findet.

Beispiele für Seltsame Schleifen sind viele Arbeiten von M.C.Escher wie „Zeichnende Hände“ und „Treppauf Treppab“. In der (spielerischen) Informatik treffen wir Seltsame Schleifen beispielsweise als Quines [20] – Programme, die ihren eigenen Quelltext ausgeben – an. Ein weiteres Beispiel ist die Meldung von Richard Stallman vom 22.03.1987, dass sich der GNU C Compiler „erfolgreich selbst kompiliert“ [21].

One More Thing. Two, actually

Zwei weitere Rezepte möchte ich Ihnen nicht vorenthalten. Wird die Equinox Runtime mit dem Switch -console <Port> gestartet, so ist sie über diesen Port per telnet erreichbar. Das macht die eingangs erwähnten applikationsspezifischen Wartungsaufgaben remote verfügbar. Sollten Sie Equinox auf dem Server einsetzen, bin ich mir sicher, dass Ihnen Use Cases für die Verwendung einfallen werden. Weiterhin kann es für die Analyse von Plattform-Plug-ins nützlich sein, kleinere Änderungen im Plattformcode durchzuführen und die Auswirkungen zu betrachten. Dafür gibt es einen einfachen und risikoarmen Weg: Importieren Sie als Erstes das Plug-in aus der Target-Plattform in den Workspace (View PLUGINS gewünschtes Plug-in selektieren, im Kontextmenü IMPORT AS > SOURCE PROJECT wählen). Danach erstellen Sie eine Launch-Konfiguration, die statt des Plug-ins aus der Target-Plattform das eben in den Workspace importierte Bundle startet und experimentieren mit dieser Instanz. Wenn Sie das Bundle nicht mehr benötigen, können Sie es einfach aus dem Workspace (und der Festplatte) löschen, da der Import eine Kopie des Target-Plattform-Bundles erzeugt.

Alle in diesem Artikel vorgestellten Herangehensweisen zur Analyse gelten selbstverständlich nicht nur für die Eclipse Workbench, sondern können bei Analyse und Erweiterung jeder Eclipse-RCP-Applikation verfolgt werden. Und das mit dem positiven Nebeneffekt, dass Sie durch intensives Lesen von Quellcode und Kontributionen Ihre eigenen Implementierungsskills und -stil trainieren.

Kommentare

Schreibe einen Kommentar

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