Suche
Kolumne Lagebericht Eclipse-IDE

Eclipse-Erweiterungen einfach selbst bauen

Simon Scholz, Lars Vogel

Eine IDE ist dazu da, die alltägliche Entwicklungsarbeit zu vereinfachen und zu beschleunigen. Doch nur wenige gehen noch einen Schritt weiter, indem sie eigene Erweiterungen für die Automatisierung spezieller Anforderungen schreiben. Um solche Plug-ins zu schreiben, greift man am besten auf den „Eclipse for Committer“ Download zurück. In diesem Paket ist schon alles enthalten, was man zum effizienten Entwickeln von Eclipse-Komponenten benötigt.

Eigene Codetemplates hinterlegen

Codetemplates sind schon eine coole Sache. Man tippt beispielsweise „syso“ in einer Java-Methode, drückt STRG + LEERTASTE und bekommt System.out.println(); generiert. Was nicht jeder weiß, ist, dass man solche Templates auch leicht selbst und ohne Eclipse-Programmierung hinterlegen kann. Hierzu wählt man WINDOW | PREFERENCES | JAVA | EDITOR | TEMPLATES | NEW. Dort kann man definieren, in welchem Bereich das Template gültig sein soll, z. B. Java Statements Templates für Java-Methoden. Zur Veranschaulichung für ein nicht triviales Template mit automatischen Imports und der Verwendung von Variablen eignet sich das Buttontemplate (Abb. 1).

Abb. 1: Anlegen eines neuen Codetemplates

Abb. 1: Anlegen eines neuen Codetemplates

Eigene Menü- und Toolbar-Einträge einbinden

Um dem Benutzer neue Optionen anzubieten, benötigt man einen Auslöser, wie einen Knopf im Hauptmenü, der Toolbar oder im Kontextmenü. Bei der Suche nach einem Ort, an dem man eine Erweiterung in ein Menü einbauen kann, hilft der Menu Spy, den man mittels ALT + SHIFT + F2 aufrufen kann.

Im Kontextmenü von Projekten findet man etwa das Refactor-Menü, wo es eine Aktion mit dem Namen Rename… gibt. Wenn man ALT + SHIFT + F2 drückt verändert sich der Cursor zu einer Lupe über einem Menü. Wenn man damit einen Menüeintrag anklickt, kommt im Fall des Eintrags Rename… das Menu-Spy-Fenster zur Analyse von Menüstrukturen anstelle der Ausführung der eigentlichen Rename-Aktion.

Sobald man den gewünschten Ort für einen speziellen Menüeintrag, z. B. menu:org.eclipse.jdt.ui.refactoring.menu, gefunden hat, gilt es, diesen mittels Menu Contribution zu erweitern. Das Einbinden von Menu Contributions erfolgt durch den Gebrauch einer fragment.e4xmi-Datei im Plug-in-Projekt. Am einfachsten lässt sie sich mittels New Wizard erzeugen (Abb. 2).

Abb. 2: Model-Fragment-Wizard

Abb. 2: Model-Fragment-Wizard

In dieser fragment.e4xmi-Datei werden Commands, Handler und die besagten Menu Contributions erstellt. Dazu werden passende Model-Fragment-Einträge erzeugt, die die Eclipse-IDE erweitern.

Abb. 3: Model-Fragment-Editor mit Commands, Handlern und Menu Contributions

Abb. 3: Model-Fragment-Editor mit Commands, Handlern und Menu Contributions

In Abbildung 3 sind die einzelnen Komponenten im Model-Fragment-Editor gelistet. Man findet dort auch die zuvor via Menu Spy ermittelte ID des Refactor-Menüs als Parent-ID für die Menu Contribution wieder. Diese enthält zwei Handled-Menu-Items, die dem Refactor-Menü hinzugefügt werden. Wer sich Sourcecode-Beispiele dazu ansehen möchte, findet sie auf unserer GitHub-Seite.

Lesen Sie auch: Die wöchentliche Eclipse-Kolumne Eclipse Weekly auf JAXenter.de

Beispiel: Zugriff auf Eclipse-Projekte

Aber was macht man nun in den neuen Menü- oder Toolbar-Einträgen? Eclipse hat ein besonderes File-API, um auf Projekte in einem Workspace zuzugreifen. Man sollte nicht direkt mit den Dateien im Eclipse Workspace via Java IO interagieren, sondern anstelle dessen Gebrauch von Klassen wie IFile, IProject oder IFolder des Plug-ins org.eclipse.core.resources machen. Dies liegt unter anderem daran, dass Java IO Änderungen nicht unbedingt unmittelbar in der Eclipse-IDE reflektiert. Mit folgendem Code wäre man in der Lage, ein Projekt zu erstellen, inklusive Resources-Ordner und einer mystyle.css-Datei:

IWorkspace workspace = ResourcesPlugin.getWorkspace();
    IWorkspaceRoot root = workspace.getRoot();
    IProject project = root.getProject("First Project");
    IFolder folder = project.getFolder("resources");
    IFile file = folder.getFile("mystyle.css");
    // at this point, no resources have been created
    if (!project.exists())
      project.create(progressMonitor);
    if (!project.isOpen())
      project.open(progressMonitor);
    if (!folder.exists())
      folder.create(IResource.NONE, true, progressMonitor);
    if (!file.exists()) {
      byte[] bytes = "div { background-color: blue; }".getBytes();
      InputStream source = new ByteArrayInputStream(bytes);
      file.create(source, IResource.NONE, progressMonitor);
    }

Projekte, Verzeichnisse und Dateien lassen sich so erstellen oder für den Zugriff verfügbar machen. So könnte man entsprechend eigene Konfigurationsdateien oder Ähnliches programmatisch im Workspace erzeugen.

Das eigene Plug-in testen und installieren

Nun hat man also ein eigenes Eclipse-Plug-in geschrieben. Aber wie kann man testen, ob das auch funktioniert? Das ist eigentlich trivial: Per rechtem Mausklick auf das Projekt, dann RUN AS | ECLIPSE PROJECT auswählen. Das startet eine „innere“ oder Laufzeit-Eclipse, in der man in Ruhe seine neue Funktionalität ausprobieren und sogar debuggen kann. Falls man mit dem Ergebnis zufrieden ist, kann man das Plug-in über FILE | EXPORT… | DEPLOYABLE PLUG-INS AND FRAGMENTS exportieren. Install into host Repository erlaubt es, das Plug-in direkt in seine eigene IDE zu installieren.
Der Weg, das Plug-in dann noch anderen zur Verfügung zu stellen, ist das Plug-in zu exportieren und das resultierende JAR zu verschicken. Dieses kopiert man sich dann in das Verzeichnis Dropins seiner Eclipse-IDE-Installation und kann es nach einem Neustart nutzen.

Java-Code parsen und verändern

Nun haben wir das Resource-API und das Erweitern von Menüs kennen gelernt und wollen jetzt auch etwas durch das Anklicken eines Menüeintrags verändern. Für Java-Entwickler ist hier das Einlesen und Verändern von Java-Dateien interessant. Ein Beispiel, wie man auf den AST (Abstract Syntax Tree) von JDT zugreift, kann auf unserer Unternehmensseite gefunden werden. Wenn es um Sourcecode in der Eclipse-IDE geht, sind Quick Fixes und Quick Assists beim Schreiben von Code noch beliebter als Menüeinträge, weil diese in der Regel schneller erreichbar sind. Wie man sie erstellt und einbindet, kann man in unserem Onlinetutorial erfahren.

Erstellen eines eigenen Wizards und mehr

Nützlich wäre, wenn man einen eigenen Wizard in die Auswahl unter FILE | NEW | OTHER… hineinbekommen könnte. Dann könnte man seinen eigenen Codegenerator hinterlegen, der ermüdende und sich wiederholende Aufgaben schnell erlegt.

Ein eigener Wizard ist schnell gebaut. Denn man kann hierfür einfach die PDE-Templates verwenden, um zu sehen, wie das funktioniert. Das Ganze geht via FILE | NEW | OTHER | PLUG-IN PROJECT relativ unkompliziert. Im Wizard gibt man an, dass man keine RCP-Applikation erzeugen will und drückt den Finish-Button (Abb. 4).

Abb. 4: Anlegen eines neuen Plug-ins

Abb. 4: Anlegen eines neuen Plug-ins

Dann kann man auf dem Extension-Tab vom Editor der MANIFEST.MF-Datei ADD… wählen und in den Wizard das richtige Flag eingeben (Abb. 5).

Abb. 5: Hinzufügen eines Beispiel-Wizards

Abb. 5: Hinzufügen eines Beispiel-Wizards

Durch die Auswahl von NEW FILE WIZARD generiert man ein Plug-in-Projekt. Hier sollte man die generierten Dateien und das Plug-in analysieren, um zu verstehen, wie das Ganze funktioniert. Auf unserer Unternehmensseite kann man sich dann noch mit den Details vertraut machen. Andere Wizards und Templates laden dort auch zum Experimentieren ein.

Fazit

Oh je, jetzt soll ich auch noch meine IDE erweitern, nur um effizienter arbeiten zu können? Keine Angst, natürlich ist das nicht notwendig, um mit Eclipse vernünftig arbeiten zu können. Wenn man aber erst mal weiß, wie man seine IDE erweitern kann, um seine tägliche Arbeit leichter erledigen zu können, ist das schon viel wert. Dadurch kann man Routinetätigkeiten – die so speziell sind, dass es dafür noch keine fertige Lösung gibt – endlich schnell und effizient erledigen.

Immer noch nicht überzeugt? Na gut, dann freuen Sie sich schon mal auf die nächste Ausgabe der Kolumne, in der wir Einstellungen in der Eclipse IDE zeigen, die viele (leider) nicht kennen, die aber mit einem Mausklick die eigene Arbeit erleichtern können. Und wir zeigen auch, wie man die Liste seiner Eclipse-Erweiterungen aktuell halten und diese zwischen verschiedenen Eclipse-Installationen bewegen kann.

Geschrieben von
Simon Scholz
Simon Scholz ist Eclipse Platform und e4 Committer. Er entwickelt auch am PDE, und Eclipse Gradle Tooling mit und nutzt seine langjährige Eclipse-RCP- und Plug-in-Erfahrung für Kundenimplementierungen, Eclipse-RCP-Workshops und Schulungen. Zudem hält er regelmäßig Vorträge auf Softwarekonferenzen bzgl. verschiedener Eclipse-Technologien.
Lars Vogel
Lars Vogel
Lars Vogel ist Geschäftsführer der vogella GmbH, die Kunden im Bereich Eclipse, Android und anderen Themen unterstützt. Als Project-Management-Committee-Mitglied, Eclipse-Projektleiter und Committer hilft er dem Eclipse-Projekt. E-Mail: lars.vogel@vogella.com
Kommentare

Schreibe einen Kommentar

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