2015-12-04 66 views
0

我有一个JavaEE,Maven应用程序。在这个应用程序中,我使用从XSD生成的类,以及通过Mapstruct生成的映射器。了解Maven生命周期

在我的EJB模块,将Maven构建应做到以下几点:

  1. 通过JAXB2 - Maven的插件生成XSD的Java类
  2. 通过 添加这些生成的类源文件夹构建辅助-行家-插件,因为:
  3. 行家处理器的插件生成Mapstruct映射器即时通过产生-mapstruct映射器,它使用这些XSD生成的类
  4. 最后加上这些mapper实现该人士透露plementions文件夹还

不幸的是,它并没有为我工作。这是EJB的pom.xml的插件部分:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>jaxb2-maven-plugin</artifactId> 
    <version>${version.jaxb2-maven-plugin}</version> 
    <executions> 
     <execution> 
      <id>xjc</id> 
      <goals> 
       <goal>xjc</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <outputDirectory>${project.build.directory}/generated-sources</outputDirectory> 
     <packageName>com.my.project</packageName> 
     <catalog>src/main/resources/xsd/CustomCatalog.xml</catalog> 
     <xjbSources> 
      <xjbSource>${project.basedir}/src/main/resources/jaxb2/</xjbSource> 
     </xjbSources> 
     <sources> 
      <source>${project.basedir}/src/main/resources/xsd/applications/MyNewClass.xsd</source> 
     </sources> 
     <xsdPathWithinArtifact>my/source/xsds</xsdPathWithinArtifact> 
    </configuration> 
</plugin> 
<plugin> 
    <groupId>org.bsc.maven</groupId> 
    <artifactId>maven-processor-plugin</artifactId> 
    <configuration> 
     <defaultOutputDirectory> 
      ${project.build.directory}/generated-sources 
     </defaultOutputDirectory> 
    </configuration> 
    <executions> 
     <execution> 
      <id>generate-mapstruct-mappers</id> 
      <phase>compile</phase> 
      <goals> 
       <goal>process</goal> 
      </goals> 
      <configuration> 
       <processors> 
        <processor>org.mapstruct.ap.MappingProcessor</processor> 
       </processors> 
      </configuration> 
     </execution> 
    </executions> 
    <dependencies> 
     <dependency> 
      <groupId>org.mapstruct</groupId> 
      <artifactId>mapstruct-processor</artifactId> 
      <version>${version.mapstruct}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.mapstruct</groupId> 
      <artifactId>mapstruct</artifactId> 
      <version>${version.mapstruct}</version> 
     </dependency> 
    </dependencies> 
</plugin> 
<!-- attach sources --> 
<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>build-helper-maven-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>add-source</id> 
      <phase>compile</phase> 
      <goals> 
       <goal>add-source</goal> 
      </goals> 
      <configuration> 
       <sources> 
        <source>${project.build.directory}/generated-sources</source> 
       </sources> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

这会产生从JAXB类,并投入资源到JAR文件。但生成的Mapper实现不在源代码中。

在eclipse中,我可以将生成的类设置为构建路径的一部分,但生成的JAR不包含mapperimplementations。

如果我改变了插件的相位,maven-processor-plugin会抛出一个找不到simbol错误,而且这个符号是从jaxb生成的类。

感谢您的帮助。

+0

尝试将'build-helper-maven-plugin'声明放在''maven-processor-plugin'声明_before_中。 – Tunaki

+0

相同:映射器实现将不在源 – victorio

+0

您使用哪个版本的'maven-processor-plugin'?你还可以提供其他插件的版本吗?你可以在github上做这种例子吗? – khmarbaise

回答

2

根据我的理解,所需流量会是如下:

  • 生成类从XSD
  • 加入他们作为源(通过生成器助手)
  • 生成MapStruct(需要等级映射器从XSD)
  • 加入他们作为源(通过生成器助手)
  • 编译所有

因此,你可以尝试:

  • 设置JAXB2 - Maven的插件执行逐步产生来源
  • 设置集结帮手 - Maven的插件的第一执行逐步产生来源(它应该添加来自XSD的类作为源)
  • 将映射器生成执行设置为阶段过程源(它应该找到XSD类作为源),但是在构建辅助器 - maven插件条目之后声明它
  • 设置build-helper-maven-plugin的第二个执行阶段来处理源,它应该添加mapp作为源

为了更好地阐明它:两个不同的阶段为两个不同的生成源执行构建辅助maven插件。指向每个生成源的两个不同文件夹(即generate-sources-xsdgenerated-sources-mappers)也更好。在你的pom中遵循这个声明顺序:jaxb2插件,mappers插件,构建助手插件。

下面一个可能的例子:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>jaxb2-maven-plugin</artifactId> 
    <version>2.1</version> 
    <executions> 
     <execution> 
      <id>xjc</id> 
      <phase>generate-sources</phase> 
      <goals> 
       <goal>xjc</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <outputDirectory>${project.build.directory}/generated-sources-xsd</outputDirectory> 
     <packageName>com.my.project</packageName> 
     <catalog>src/main/resources/xsd/CustomCatalog.xml</catalog> 
     <xjbSources> 
      <xjbSource>${project.basedir}/src/main/resources/jaxb2/</xjbSource> 
     </xjbSources> 
     <sources> 
      <source>${project.basedir}/src/main/resources/xsd/applications/MyNewClass.xsd</source> 
     </sources> 
     <xsdPathWithinArtifact>my/source/xsds</xsdPathWithinArtifact> 
    </configuration> 
</plugin> 
<plugin> 
    <groupId>org.bsc.maven</groupId> 
    <artifactId>maven-processor-plugin</artifactId> 
    <version>2.2.4</version> 
    <configuration> 
     <defaultOutputDirectory> 
      ${project.build.directory}/generated-sources-mappers 
     </defaultOutputDirectory> 
    </configuration> 
    <executions> 
     <execution> 
      <id>generate-mapstruct-mappers</id> 
      <phase>process-sources</phase> 
      <goals> 
       <goal>process</goal> 
      </goals> 
      <configuration> 
       <processors> 
        <processor>org.mapstruct.ap.MappingProcessor</processor> 
       </processors> 
      </configuration> 
     </execution> 
    </executions> 
    <dependencies> 
     <dependency> 
      <groupId>org.mapstruct</groupId> 
      <artifactId>mapstruct-processor</artifactId> 
      <version>1.0.0.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>org.mapstruct</groupId> 
      <artifactId>mapstruct</artifactId> 
      <version>1.0.0.Final</version> 
     </dependency> 
    </dependencies> 
</plugin> 
<!-- attach sources --> 
<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>build-helper-maven-plugin</artifactId> 
    <version>1.9</version> 
    <executions> 
     <execution> 
      <id>add-source</id> 
      <phase>generate-sources</phase> 
      <goals> 
       <goal>add-source</goal> 
      </goals> 
      <configuration> 
       <sources> 
        <source>${project.build.directory}/generated-sources-xsd</source> 
       </sources> 
      </configuration> 
     </execution> 
     <execution> 
      <id>add-source2</id> 
      <phase>process-sources</phase> 
      <goals> 
       <goal>add-source</goal> 
      </goals> 
      <configuration> 
       <sources> 
        <source>${project.build.directory}/generated-sources-mappers</source> 
       </sources> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

注:在片段上方我不得不添加一些版本,以使其发挥作用。

有关Maven生命周期阶段的完整列表,here