【问题标题】:Maven lifecycle understandingMaven生命周期理解
【发布时间】:2015-12-04 15:02:45
【问题描述】:

我有一个 JavaEE、maven 应用程序。在这个应用程序中,我使用从 XSD 生成的类,以及通过 Mapstruct 生成的映射器。

在我的 EJB 模块中,maven 构建应该执行以下操作:

  1. 通过 jaxb2-maven-plugin 从 XSD 生成 java 类
  2. 将这些生成的类添加到源文件夹 build-helper-maven-plugin,因为:
  3. ma​​ven-processor-plugin 通过 generate-mapstruct-mappers 生成 Mapstruct 映射器实现,它使用这些 XSD 生成的类
  4. 最后将这些映射器实现也添加到源文件夹中

不幸的是,它对我不起作用。这是 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 不包含映射实现。

如果我更改插件的阶段,maven-processor-plugin 将抛出 cannot find simbol 错误,并且符号是从 jaxb 生成的类。

谢谢你帮助我。

【问题讨论】:

  • 尝试把build-helper-maven-plugin声明之前 maven-processor-plugin声明。
  • 同理:映射器实现不会在源头
  • 你使用哪个版本的maven-processor-plugin`?您还可以提供使用的其他插件的版本吗?你能在github上做一个这样的示例项目吗?

标签: java maven jaxb maven-plugin maven-lifecycle


【解决方案1】:

据我了解,所需的流程如下:

  • 从 XSD 生成类
  • 将它们添加为源(通过 Builder 助手)
  • 从 MapStruct 生成映射器(需要 XSD 中的类)
  • 将它们添加为源(通过 Builder 助手)
  • 全部编译

因此,您可以尝试:

  • 将 jaxb2-maven-plugin 的执行设置为阶段 generate-sources
  • 将 build-helper-maven-plugin 的第一次执行设置为阶段 generate-sources(应将 XSD 中的类添加为源)
  • 将映射器生成执行设置为阶段进程源(应该将 XSD 类作为源),但在 build-helper-maven-plugin 条目之后声明它
  • 将 build-helper-maven-plugin 的第二次执行设置为阶段 process-sources,这应该将映射器添加为源

为了更好地澄清它:build-helper-maven-plugin 的两次执行在两个不同的阶段为两个不同的生成源。最好为每个生成的源指向两个不同的文件夹(即generate-sources-xsd 和generated-sources-mappers)。在您的 pom 中遵循以下声明顺序:jaxb2 插件、映射器插件、构建助手插件。

下面是一个可能的例子:

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

注意:在上面的 sn-p 中,我必须添加一些版本才能使其正常工作。

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

【讨论】:

    猜你喜欢
    • 2014-12-05
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 2021-01-03
    • 1970-01-01
    相关资源
    最近更新 更多