Xtext und Tycho und Multi-DSL

DSL’s sind ja in aller Munde. Nicht erst seit Groovy und Co. nutzt man DSLs. Mit Xtext gibt es ein sehr mächtiges Werkzeug im Eclipse-Ökosystem um sich schnell und leicht eine eigene Sprache inklusive Editor und Code-Generator zu bauen. Wie das Ganze im Detail aussieht, findet ihr in einer Präsentation von mir. Richtig schwierig wird es aber wenn man versucht mehrere Xtext-DSLs zu kombinieren und dann das Ganze noch als Maven-Build mit Tycho aufzusetzen. Dazu gibt es nicht wirklich viel im Netz zu finden. Deswegen hier das Schritt-für-Schritt Beiespiel.

Das Ganze Beispiel ist auf GitHub verfügbar.

Allgemeines Setup

  1. Erstelle neues Xtext-Projekt siehe Github-Commit
  2. Erzeuge Ordnerstruktur, damit relative Pfadangaben funktionieren. Dabei müssen die Referenzen zu den Test-Projekten angepasst werden, damit der Build funktioniert
  3. Initial ist bei neuen Projekte einmal über Eclipse zu bauen, damit die nötigen nur erstmalig generierten Klassen erstellt werden.
  4. Füge Maven-Parent Projekt,Repository-Projekt und Target-Plattform hinzu. Außerdem sollte das compile-Target im Eclipse auf target/classes zeigen
  1. Nun kann ein erster Build ausgeführt werden.
  2. Dazu zunächst das Target-Plattform Modul im lokalen M2-Repository verfügbar machen mit mvn install. Dazu in das targetplattform-Projekt wechseln (org.xtext.example.targetplatform) und mvn install ausführen:
    mbpromare:org.xtext.example.targetplatform mare$ mvn install

    Danach sollte folgende Meldung kommen:

    [INFO] BUILD SUCCESS
  1. Als nächstes wechselt man in das Repository-Projekt (releng/org.xtext.example.repository) und rüft über
    mvn install

    die Installation auf. Zunächst kommt folgender Meldung

    [INFO] Computing target platform for MavenProject: org.xtext.example:org.xtext.example.repository:0.5.0-SNAPSHOT @ /Users/mare/Documents/Programmierung/git/github/xText/Xtext-Maven-BuildExample/releng/org.xtext.example.repository/pom.xml

    und anschließend starten diverse Downloads. Das ganze kann ca. 5-10 Minuten dauern

  1. Dann kann das eigentliche Plugin per Maven gebaut werden: Dazu wechselt man in das Parent-Projekt (releng/org.xtext.example.parent) und führt folgenden Befehl aus
    mbpromare:org.xtext.example.parent mare$ mvn install

    Damit laufen die Xtext Build jetzt mittels Tycho auch über Maven.

  2. Nun sollte der Vollständigkeit halber noch die Update-Sites, Product-Konfiguration (Plug-In-Projekt) und Feature-Projekt [ angelegt] werden.
  3. Optional kann man noch SDK-Projekte bei Bedarf anlegen
  4. Anschließend läuft der Build erfolgreich durch:
mbpromare:org.xtext.example.maven.mydsl1 mare$ mvn compile 
[INFO] Scanning for projects... 
[INFO] Computing target platform for MavenProject: org.xtext.example.maven:org.xtext.example.maven.mydsl1:0.5.0-SNAPSHOT @ /Users/mare/Documents/Programmierung/git/github/xText/Xtext-MavenExample/plugins/org.xtext.example.maven.mydsl1/pom.xml 
[INFO] Resolving dependencies of MavenProject: org.xtext.example.maven:org.xtext.example.maven.mydsl1:0.5.0-SNAPSHOT @ /Users/mare/Documents/Programmierung/git/github/xText/Xtext-MavenExample/plugins/org.xtext.example.maven.mydsl1/pom.xml 
[INFO] Resolving class path of MavenProject: org.xtext.example.maven:org.xtext.example.maven.mydsl1:0.5.0-SNAPSHOT @ /Users/mare/Documents/Programmierung/git/github/xText/Xtext-MavenExample/plugins/org.xtext.example.maven.mydsl1/pom.xml 
[INFO] 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building org.xtext.example.maven.mydsl1 0.5.0-SNAPSHOT 
[INFO] ------------------------------------------------------------------------ 
[INFO] 
[INFO] --- tycho-packaging-plugin:0.15.0:build-qualifier (default-build-qualifier) @ org.xtext.example.maven.mydsl1 --- 
[INFO] 
[INFO] --- tycho-packaging-plugin:0.15.0:validate-id (default-validate-id) @ org.xtext.example.maven.mydsl1 --- 
[INFO] 
[INFO] --- tycho-packaging-plugin:0.15.0:validate-version (default-validate-version) @ org.xtext.example.maven.mydsl1 --- 
[INFO] 
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ org.xtext.example.maven.mydsl1 --- 
[debug] execute contextualize 
[INFO] Using 'ISO-8859-1' encoding to copy filtered resources. 
[INFO] skip non existing resourceDirectory /Users/mare/Documents/Programmierung/git/github/xText/Xtext-MavenExample/plugins/org.xtext.example.maven.mydsl1/src/main/resources 
[INFO] 
[INFO] --- tycho-compiler-plugin:0.15.0:compile (default-compile) @ org.xtext.example.maven.mydsl1 --- 
[INFO] Nothing to compile - all classes are up to date 
[WARNING] Source directory /Users/mare/Documents/Programmierung/git/github/xText/Xtext-MavenExample/plugins/org.xtext.example.maven.mydsl1/src-gen does not exist 
[WARNING] Source directory /Users/mare/Documents/Programmierung/git/github/xText/Xtext-MavenExample/plugins/org.xtext.example.maven.mydsl1/xtend-gen does not exist 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 48.161s 
[INFO] Finished at: Tue Oct 02 17:01:34 CEST 2012 
[INFO] Final Memory: 51M/104M 
[INFO] ------------------------------------------------------------------------
  1. Am Ende fügt man noch die Feature-Plugin, Product und Updatesite-Projekte hinzu und führt im Ordner releng/org.xtext.example.parent ein mvn install aus. Das Ergebnis sollte dann so aussehen
[INFO] --- maven-install-plugin:2.3.1:install (default-install) @ org.xtext.example.product ---
[INFO] Installing /Users/mare/Documents/Programmierung/git/github/xText/Xtext-Maven-BuildExample/releng/org.xtext.example.product/target/org.xtext.example.product-0.5.0-SNAPSHOT.zip to /Users/mare/.m2/repository/org/xtext/example/org.xtext.example.product/0.5.0-SNAPSHOT/org.xtext.example.product-0.5.0-SNAPSHOT.zip
[INFO] Installing /Users/mare/Documents/Programmierung/git/github/xText/Xtext-Maven-BuildExample/releng/org.xtext.example.product/pom.xml to /Users/mare/.m2/repository/org/xtext/example/org.xtext.example.product/0.5.0-SNAPSHOT/org.xtext.example.product-0.5.0-SNAPSHOT.pom
[INFO] Installing /Users/mare/Documents/Programmierung/git/github/xText/Xtext-Maven-BuildExample/releng/org.xtext.example.product/target/products/org.xtext.example.product-win32.win32.x86.zip to /Users/mare/.m2/repository/org/xtext/example/org.xtext.example.product/0.5.0-SNAPSHOT/org.xtext.example.product-0.5.0-SNAPSHOT-win32.win32.x86.zip
[INFO] Installing /Users/mare/Documents/Programmierung/git/github/xText/Xtext-Maven-BuildExample/releng/org.xtext.example.product/target/products/org.xtext.example.product-win32.win32.x86_64.zip to /Users/mare/.m2/repository/org/xtext/example/org.xtext.example.product/0.5.0-SNAPSHOT/org.xtext.example.product-0.5.0-SNAPSHOT-win32.win32.x86_64.zip
[INFO] Installing /Users/mare/Documents/Programmierung/git/github/xText/Xtext-Maven-BuildExample/releng/org.xtext.example.product/target/products/org.xtext.example.product-macosx.cocoa.x86_64.zip to /Users/mare/.m2/repository/org/xtext/example/org.xtext.example.product/0.5.0-SNAPSHOT/org.xtext.example.product-0.5.0-SNAPSHOT-macosx.cocoa.x86_64.zip
[INFO] Installing /Users/mare/Documents/Programmierung/git/github/xText/Xtext-Maven-BuildExample/releng/org.xtext.example.product/target/products/org.xtext.example.product-macosx.cocoa.x86.zip to /Users/mare/.m2/repository/org/xtext/example/org.xtext.example.product/0.5.0-SNAPSHOT/org.xtext.example.product-0.5.0-SNAPSHOT-macosx.cocoa.x86.zip
[INFO] Installing /Users/mare/Documents/Programmierung/git/github/xText/Xtext-Maven-BuildExample/releng/org.xtext.example.product/target/products/org.xtext.example.product-linux.gtk.x86.zip to /Users/mare/.m2/repository/org/xtext/example/org.xtext.example.product/0.5.0-SNAPSHOT/org.xtext.example.product-0.5.0-SNAPSHOT-linux.gtk.x86.zip
[INFO] Installing /Users/mare/Documents/Programmierung/git/github/xText/Xtext-Maven-BuildExample/releng/org.xtext.example.product/target/products/org.xtext.example.product-linux.gtk.x86_64.zip to /Users/mare/.m2/repository/org/xtext/example/org.xtext.example.product/0.5.0-SNAPSHOT/org.xtext.example.product-0.5.0-SNAPSHOT-linux.gtk.x86_64.zip
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] org.xtext.example.targetplatform .................. SUCCESS [0.677s]
[INFO] org.xtext.example.parent .......................... SUCCESS [0.155s]
[INFO] org.xtext.example.maven.mydsl1 .................... SUCCESS [30.381s]
[INFO] org.xtext.example.maven.mydsl1.ui ................. SUCCESS [1.910s]
[INFO] org.xtext.example.maven.mydsl1.tests .............. SUCCESS [3.774s]
[INFO] org.xtext.example.maven.mydsl2 .................... SUCCESS [18.021s]
[INFO] org.xtext.example.maven.mydsl2.ui ................. SUCCESS [1.636s]
[INFO] org.xtext.example.maven.mydsl2.tests .............. SUCCESS [2.695s]
[INFO] org.xtext.example.feature ......................... SUCCESS [0.310s]
[INFO] org.xtext.example.updatesite ...................... SUCCESS [5.264s]
[INFO] org.xtext.example.product ......................... SUCCESS [1:17.585s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2:43.112s
[INFO] Finished at: Fri Oct 19 13:35:45 CEST 2012
[INFO] Final Memory: 42M/104M
[INFO] ------------------------------------------------------------------------

Bei Bedarf kann man das Feature Projekt auch noch für das SDK und Test-Projekt anlegen

Mehr Infos gibts hier noch zu Tycho:

CI-Integration

Folgende Einstellungen sind im Jenkins vorzunehmen, wichtig ist dabei das Setzen der privaten Maven-Repo-Settings:

Xtext maven jenkins.png Beispiel inCloudBees

Fehler

Versions-Fehler
mbpromare:org.xtext.example.maven.mydsl1 mare$ mvn compile [INFO] Scanning for projects... 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 18.336s
[INFO] Finished at: Thu Oct 18 16:43:23 CEST 2012
[INFO] Final Memory: 16M/81M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.eclipse.tycho:tycho-packaging-plugin:0.15.0:validate-version (default-validate-version) on project org.xtext.example.maven.mydsl1: Unqualified OSGi version 1.0.0.qualifier must match unqualified Maven version 0.5.0-SNAPSHOT for SNAPSHOT builds -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[ERROR] 
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <goals> -rf :org.xtext.example.maven.mydsl1

Der obere Fehler liegt in den verschieden Versionsnummern in Maven und Eclipse. 0.5.0.qualifier in manifest bedeutet 0.5.0.SNAPSHOT in Maven. Diese werden angepasst, entweder in den pom.xml oder in der MANIFEST.MF

This entry was posted in Fun and tagged , , , , . Bookmark the permalink.

2 Responses to Xtext und Tycho und Multi-DSL

Schreibe einen Kommentar

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

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.