2011-10-04 33 views
0

我正在寻找一个使用XText 2.0的项目pom.xml的示例,特别是在“普通”maven项目中的代码生成器XPand 1.1。使用Maven构建XText 2.0和XPand 1.1

我已经花时间与谷歌,但我可以使用错误的条款,或没有例子。

我有一个已经工作的pom for xtext 0.7.2,我想将项目更新到2.0。但我不知道从哪里开始。 我目前所面对的是4个Maven项目这样的结构:

  • 看MyDSL
  • mydsl.generator(未使用)
  • mydsl.ui
  • 应用(含XPAND模板来生成代码)

mydsl项目是xtext 0.7.2项目和其他pom(mydsl),它提供了生成的类作为maven依赖项。

application有一个mwe工作流和xpand模板来生成源代码。因为我没有实现这么多的gui编辑器功能,我甚至会除掉所有的xtext东西(语法和xpand模板除外)并构建一个完整的新的xtext 2项目。

但我真的没有胶水如何建立(新)mydsl项目的POM。

回答

1

其中最棘手的部分是在XText2语法项目会出现在xtend-gen文件夹woth名<<project>>Generator.java的文件。该文件不是由Generate<<project>>.mwe2工作流创建的,而是它通过某种eclipse魔术创建的。但是这个文件需要编译代码!

所以我的解决方案是让Eclipse生成该文件,然后像任何正常的手写类一样将其添加到svn。

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

聚甲醛项目的含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> 

使用语法和dsl进行源代码生成的项目的POM。这与xtext 0.7.1几乎相同。但有一个区别。在mwe文件中使用的MweReader不会退出(因为xtext 1.0.1)所以需要使用org.eclipse.xtext.mwe.Reader。该阅读器不再将模型文件作为输入,而是文件的路径。而且它还将其存储在所谓的“插槽”中。但是这个插槽是一个元素列表。因此,人们需要改变:在<expand value="templates::Main::main FOR model"/>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> 

兆瓦的工作流程在该项目

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