Одна из самых сложных частей заключается в том, что в проекте грамматики XText2 будет файл в папке xtend-gen
с именем <<project>>Generator.java
. Этот файл не создается рабочим процессом Generate<<project>>.mwe2
, вместо этого кажется, что он создан какой-то магией затмения. Но этот файл нужен для компиляции кода!
Поэтому мое решение состоит в том, чтобы позволить eclipse сгенерировать этот файл, а затем добавить его в svn, как любой обычный класс, написанный от руки.
Затем нужно только добавить этот pom в проект. Таким образом, maven также запустит рабочий процесс. Но есть один недостаток: рабочий процесс также генерирует классы для соседних проектов, .ui
и .test
, и поэтому ему нужны файлы манифеста. Чтобы преодолеть проблему плагина выпуска maven, можно добавить родительский проект maven, который содержит проект Grammer и два макета .ui
и .test
Pom проекта, содержащего грамматик xtext:
...
<dependencies>
<dependency>
<groupId>org.eclipse.plugins</groupId>
<artifactId>org.eclipse.xtext.generator</artifactId>
<version>2.0.0.v201106070531</version>
</dependency>
<dependency>
<groupId>org.eclipse.plugins</groupId>
<artifactId>org.eclipse.emf.codegen.ecore</artifactId>
<version>2.6.1.v20100914-1218</version>
</dependency>
<dependency>
<groupId>org.antlr.generator</groupId>
<artifactId>org.antlr.generator</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.plugins</groupId>
<artifactId>org.eclipse.emf.mwe2.launch</artifactId>
<version>2.0.0.v201106070634</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.13</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
<resources>
<resource>
<directory>src</directory>
</resource>
<resource>
<directory>src-gen</directory>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<filesets>
<fileset>
<directory>${basedir}/src-gen</directory>
<includes>
<include>com/</include>
<include>org/</include>
</includes>
<followSymlinks>false</followSymlinks>
</fileset>
<fileset>
<directory>${basedir}/xtend-gen</directory>
<includes>
<include>com/</include>
<include>org/</include>
</includes>
<excludes>
<exclude>**/ProdDef2Generator.java</exclude>
</excludes>
<followSymlinks>false</followSymlinks>
</fileset>
</filesets>
</configuration>
</plugin>
<plugin>
<groupId>org.fornax.toolsupport</groupId>
<artifactId>fornax-oaw-m2-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<!-- <checkResources> <checkResource> src/com\queomedia\bcsweb\productdefinition\ProdDef2.xtext
</checkResource> </checkResources> -->
<outletSrcDir>src-gen</outletSrcDir>
<outletSrcOnceDir>src</outletSrcOnceDir>
<rootDir>${project.basedir}</rootDir>
</configuration>
<executions>
<execution>
<id>generateGrammer</id>
<phase>generate-sources</phase>
<goals>
<goal>run-workflow</goal>
</goals>
<configuration>
<workflowDescriptor>src/org/test/test/GenerateProdDef2.mwe2</workflowDescriptor>
<workflowEngine>mwe2</workflowEngine>
<timestampFileName>generator-generateGrammer-timestamp.tmp</timestampFileName>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<id>add-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>src-gen</source>
<source>xtend-gen</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
<!-- The plugin.xml must be included, but is not on a resource path -->
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<phase>process-resources</phase>
<configuration>
<tasks>
<copy todir="${basedir}/target/classes" file="${basedir}/plugin.xml" />
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
POM проекта, который использует средство программирования и DSL для генерации исходного кода. Это почти то же самое, что и для xtext 0.7.1. Но с одним отличием. MweReader
, используемый в файле mwe, больше не выходит (начиная с xtext 1.0.1). Поэтому нужно использовать org.eclipse.xtext.mwe.Reader
. Этот ридер больше не принимает в качестве входных данных файл модели, а путь к файлу. И он также хранит его в так называемом «слоте». Но этот слот представляет собой СПИСОК элементов. Итак, нужно изменить: FOR
в <expand value="templates::Main::main FOR model"/>
на FOREACH
<dependencies>
<dependency>
<groupId>test.xtext</groupId>
<artifactId>grammerProject</artifactId>
<version>1.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.eclipse.plugins</groupId>
<artifactId>org.eclipse.xtext.generator</artifactId>
<version>2.0.0.v201106070531</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.eclipse.plugins</groupId>
<artifactId>org.eclipse.emf.codegen.ecore</artifactId>
<version>2.6.1.v20100914-1218</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.antlr.generator</groupId>
<artifactId>org.antlr.generator</artifactId>
<version>3.2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.eclipse.plugins</groupId>
<artifactId>org.eclipse.emf.mwe2.launch</artifactId>
<version>2.0.0.v201106070634</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.13</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<!-- there is the .mwe workflow located, in a sub dir called model, the dsl and in an other sub dir called templates, the xpt files. -->
<directory>src/main/xtext</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.fornax.toolsupport</groupId>
<artifactId>fornax-oaw-m2-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<rootDir>${project.basedir}</rootDir>
<!-- run only if this file is changed -->
<checkResources>
<checkResource>
src/main/xtext/model/GermanDesk.proddef2
</checkResource>
</checkResources>
<!--
<outletSrcDir>src-gen</outletSrcDir>
<outletSrcOnceDir>src</outletSrcOnceDir>
-->
</configuration>
<executions>
<execution>
<id>generateJavaClassesFromXText</id>
<phase>generate-sources</phase>
<goals>
<goal>run-workflow</goal>
</goals>
<configuration>
<!-- Die Workflow-Description wird in einem Ressourcen-Verzeichnis gesucht. -->
<workflowDescriptor>ProdDef2JavaGenerator.mwe</workflowDescriptor>
<workflowEngine>mwe</workflowEngine>
<properties>
<projectBasedir>${project.basedir}</projectBasedir>
</properties>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>add-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>${basedir}/target/generated-sources</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
Рабочий процесс Mwe в этом проекте
<workflow>
<property name="project.src.directory" value="${projectBasedir}/src/main"/>
<property name="project.target.directory" value="${projectBasedir}/target"/>
<property name="modelFileDir" value="${project.src.directory}/xtext/model/"/>
<property name="srcGenTargetDir" value="${project.target.directory}/generated-sources"/>
<property name="templateTargetDir" value="${project.target.directory}/generated-sources-templates"/>
<bean class="org.eclipse.emf.mwe.utils.StandaloneSetup" platformUri=".."/>
<component class="org.eclipse.emf.mwe.utils.DirectoryCleaner" directory="${srcGenTargetDir}"/>
<component class="org.eclipse.emf.mwe.utils.DirectoryCleaner" directory="${templateTargetDir}"/>
<component class="org.eclipse.xtext.mwe.Reader" path="${modelFileDir}" >
<register class="com.queomedia.bcsweb.productdefinition.ProdDef2StandaloneSetup"/>
<load slot='model' type='Model'/>
</component>
<component class="org.eclipse.xpand2.Generator">
<metaModel class="org.eclipse.xtend.typesystem.emf.EmfRegistryMetaModel"/>
<fileEncoding value="UTF-8"/>
<expand value="templates::ProductCustomClass::productCustomClasses FOREACH model"/>
<genPath value="${templateTargetDir}"/>
<beautifier class="org.eclipse.xpand2.output.JavaBeautifier"/>
</component>
<component class="org.eclipse.xpand2.Generator">
<metaModel class="org.eclipse.xtend.typesystem.emf.EmfRegistryMetaModel"/>
<fileEncoding value="UTF-8"/>
<expand value="templates::Main::main FOREACH model"/>
<genPath value="${srcGenTargetDir}"/>
<beautifier class="org.eclipse.xpand2.output.JavaBeautifier"/>
</component>
</workflow>
person
Ralph
schedule
17.10.2011