Leichtes Skripting – Eclipse Advanced Scripting Environment (EASE)
Erschienen im KaffeeKlatsch 11/2018
In grauer Vorzeit, als Emacs noch weiter verbreitet war, konnte der Anwender seinen Editor bzw. seine IDE selbstverständlich durch eigene Skripte einfach erweitern. Einerseits geht es dabei um die Anpassung vorhandener Funktionen aber andererseits um Ad-Hoc Skripte die – mal eben – einmalige aber langwierige Texttransformationen einfacher durchführen. Mit EASE ist das auch in Eclipse wieder easy.
Eclipse – wie auch die anderen großen Java-IDEs – lässt sich über Plugins erweitern. Diese Plugins kann der Anwender aber normalerweise nicht erweitern, sondern nur im Rahmen der vorgesehenen Einstellungen konfigurieren. Eine Plugin übergreifende Anpassung oder gar Automatisierung ist für den Benutzer nicht vorgesehen. Die Hürde für ein eigenes Plugin ist aber hoch:
- Eigenes Plugin-Projekt aufsetzen
- Einstellungen mit Wizards anpassen
- Code in Java implementieren
- Klassen übersetzen
- Projekt als Plugin exportieren
- neues Plugin in Eclipse installieren
- Eclipse neu starten
- Wiederholen bis alle Fehler ausgemerzt sind
- Plugin-Funktion anwenden
Wenn das Plugin in einer CI-Pipeline gebaut werden soll, darf man sich zusätzlich mit arkanen Werkzeugen wie Maven-Tycho herumärgern.
Mit EASE1, dem Eclipse Advanced Scripting Environment, geht das deutlich einfacher:
- Skript Datei in bestehendes Projekt legen
- mit “Run As → EASE Script” ausführen
Dabei wird das Skript nicht in einem neuen Prozess ausgeführt, sondern direkt im laufenden Eclipse selbst. Das Skript hat also – über “Module” – Zugriff auf die Datenstrukturen, Editoren, Views und Perspektiven von Eclipse. Liegt das Skript in einem “beobachteten Verzeichnis” kann es sich in Menüs und Toolbars einhängen oder an Tastenkombinationen binden. Als Skript-Sprachen stehen “Engines” u.A. für JavaScript, Groovy, Jython und Jruby bereit.
Installation
Die Installation von EASE erfolgt über die Update-Site. Allerdings sollte man aus dieser Update-Site zuerst nur bestimmte Features installieren. Erstens würden einige der Features sehr viele zusätzliche Plugins benötigen und zweitens arbeiten im Moment nicht alle Plugins sauber mit dem aktuellen Eclipse (SimRel 2018-09) zusammen. Folgende Features sollten ausgewählt werden (siehe Abbildung 1):
- EASE Core Framework
- EASE Components
- EASE JavaScript Support (nicht mit “EASE JavaScript Feature” zu verwechseln, letzteres liegt in einer zu alten Version (0.3) statt in der Version 0.6 oder höher vor)
- EASE Modules
Die folgenden zusätzlichen Features schaden ebenfalls nicht:
- EASE JVM Engine
- EASE Groovy Support
- EASE Script Archive Support
EASE stellt im Git-Repository “org.eclipse.ease.scripts.git”2
etliche Beispielprojekte und Einführungs-Skripte vor. Insbesondere kann man
die erfolgreiche Installation mit dem Skript 2 Hello World UI.js
prüfen,
indem man im Kontext-Menü der Datei “Run As → EASE Script” auswählt. Es
erscheint eine Dialogbox mit “Hello World”.
Beispiel
Eine Aufgabe für Skripting in der IDE sind komplexe Suchen im Quellcode. Als
Beispiel: Eine Methode someCall(String c, int i)
bekommt als ersten Parameter
bisher meist einen String mit einer Annäherung an eine mathematische Konstante
wie π oder e. Bisherige Aufrufstellen folgen diesem Schema:
String foo = Constants.PI;
// Weitere Berechnungen
someCall(foo, 42);
Gesucht sind nun alle Aufrufer von someCall
, bei denen Constants.PI
bis zu
drei Zeilen zuvor verwendet wird. Diese Stellen sollen manuell geprüft werden,
ob statt PI
die bessere Annäherung BETTER_PI
verwendet werden soll.
Die IDE-Funktion “Find References” kann entweder nur alle Vorkommen von
PI
oder alle Aufrufe von someCall
finden aber nicht die Kombination von
beiden. Eine reine Text-Suche kann das durch Regular Expressions nur, wenn
beide Suchbegriffe in derselben Zeile stehen.
Das Vorgehen mittels EASE-Skripts ist einfach:
- Frage den Benutzer, in welchen Verzeichnis gesucht werden soll
- Finde darin jede Java-Datei
- Durchsuche alle Dateien
- Erzeuge einen neuen Task für jeden Suchtreffer
Anschließend liegen alle Treffer als temporäre Tasks in der Task-View vor und können durch einfaches Klicken nacheinander abgearbeitet werden. Oder ein zweites Skript springt auf Tastendruck zur Position des ersten Tasks und löscht ihn. Der Anwender inspiziert die Codestelle, drückt die Taste erneut und kann so die Liste effizient abarbeiten.
Die vollständigen Skripte sind am Ende des Artikels abgedruckt. Bemerkenswert ist nicht die Logik selbst sondern nur einige Punkte:
-
Die Skripte wurden in JavaScript geschrieben. EASE unterstützt die beiden JavaScript-Engines Rhino und Nashorn. Die Standardeinstellung ist Rhino, da diese Engine auch Debugging unterstützt. Aber das ältere Rhino versteht kein Javascript, wie es aktuelle Browser unterstützen.
-
EASE ermöglicht aus JavaScript heraus den Zugriff auf alle Java-Klassen – allerdings nur mit qualifiziertem Namen.
-
Für viele Dinge stellt EASE über “Module” einen einfacheren Zugriff bereit. Diese Module müssen zuerst mit
loadModule()
in das Skript geladen werden. Den Namen, den Inhalt und die Dokumentation der Module bzw. Methoden zeigt EASE in der “Modules Explorer”-View an. -
Das “Suche und Erzeuge Tasks”-Skript kann noch sinnvoll über “Run As → EASE Script” ausgeführt werden. Die Datei kann dabei in irgendeinem offenen Eclipse Projekt liegen. Das zweite Skript ist aber nur über einen einfachen Tastendruck effizient bedienbar. Das Skript enthält daher im Kommentar die Zeile:
keyboard : F7
Über derartige Schlüsselwörter 3 können die Skripte EASE weitreichend konfigurieren – aber nur, wenn EASE diese Skripte automatisch findet! Daher muss das Verzeichnis, in dem die beiden Skripte liegen, unter “Window → Preferences → Scripting → Script Locations” in die Liste der beobachteten Verzeichnisse aufgenommen werden.
-
Das zweite Skript benötigt noch die Freigabe “Allow scripts to run code in UI thread”, die sich unter “Window → Preferences → Scripting” befindet.
Fazit
Die beiden Skripte lösen das Problem, zwei nicht unmittelbar benachbarte Dinge zu finden, mit wenig Code und noch dazu mit komfortabler Einbindung in die IDE. Shell-Skripte könnten dieselben Stellen finden, aber die Integration in die IDE fehlt dann völlig.
EASE biete für viele Dinge komfortable Hilfsmethoden an. Reichen diese nicht aus, dann ist durch den direkten Zugriff auf die Eclipse-Internas keine zusätzliche Hürde – wie zum Beispiel ein erzwungener Sprachwechsel oder zusätzliche Plugins – vorhanden.
Skripting in der IDE ist also wieder möglich. Seltsam, dass man so wenig davon hört!