【问题标题】:Building XText 2.0 and XPand 1.1 with Maven使用 Maven 构建 XText 2.0 和 XPand 1.1
【发布时间】:2011-10-04 10:28:05
【问题描述】:

我正在为使用 XText 2.0 的项目寻找示例 pom.xml,尤其是“普通”maven 项目中的代码生成器 XPand 1.1。

我已经花时间在谷歌上,但我可能使用了错误的术语,或者没有例子。

我有一个用于 xtext 0.7.2 的 pom,我想将项目更新到 2.0。但我不知道从哪里开始。 我目前拥有的是 4 个 maven 项目的结构:

  • mydsl
  • mydsl.generator(未使用)
  • mydsl.ui
  • 应用程序(包含用于生成代码的 xpand 模板)

mydsl 项目是 xtext 0.7.2 项目,带有额外的 pom in (mydsl),将生成的类作为 maven 依赖项提供。

application 有一个mwe 工作流和 xpand 模板来生成源代码。这个项目对mydsl有一个maven依赖

因为我没有实现这么多的 gui 编辑器功能,我什至除了扔掉所有的 xtext 东西(除了语法和 xpand 模板)并构建一个全新的 xtext 2 项目。

但我真的不知道如何为(新)mydsl 项目构建 pom。

【问题讨论】:

    标签: java maven xtext


    【解决方案1】:

    我找到了真正的 maven xtext2 项目。

    检查这个: http://code.google.com/a/eclipselabs.org/p/spray/

    【讨论】:

      【解决方案2】:

      最棘手的部分之一是,在 XText2 语法项目中,xtend-gen 文件夹中将有一个文件名为 <<project>>Generator.java。该文件不是由Generate<<project>>.mwe2 工作流创建的,而是由一些eclipse 魔术创建的。但是编译代码需要这个文件!

      所以我的解决方案是让eclipse生成那个文件,然后像普通的手写类一样把它添加到svn中。

      然后只需要将这个 pom 添加到项目中即可。所以maven也会启动Workflow。 但有一个缺点:工作流还会为相邻项目生成类,.ui.test,因此它需要清单文件。为了克服 maven 发布插件的麻烦,可以添加一个父 maven 项目,其中包含 grammer 项目和两个假人 .ui.test

      包含 xtext 语法的项目的 Pom:

      ...
      <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>
      

      使用语法和 dsl 生成源代码的项目的 POM。这与 xtext 0.7.1 几乎相同。但有一点不同。 mwe 文件中使用的MweReader 不再退出(从 xtext 1.0.1 开始)所以需要使用org.eclipse.xtext.mwe.Reader。这个阅读器不再将模型文件作为输入,而是文件的路径。它还将它存储在所谓的“插槽”中。但是这个槽是一个元素列表。所以需要更改:&lt;expand value="templates::Main::main FOR model"/&gt; 中的 FORFOREACH

      <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>
      

      【讨论】:

        猜你喜欢
        • 2020-08-31
        • 1970-01-01
        • 2018-06-27
        • 1970-01-01
        • 2018-01-31
        • 1970-01-01
        • 2013-02-18
        • 1970-01-01
        • 2010-09-07
        相关资源
        最近更新 更多