Maven多模块项目的报告和站点生成

11

我试图获取包含子模块的项目以正确地测试和生成报告,但是遇到了一些问题。

我的项目结构如下:

parent
  |-test1
  |-test2

parent的pom.xml文件看起来像这样:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>parent</groupId>
<artifactId>parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
    <module>test1</module>
    <module>test2</module>
</modules>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.16</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-report-plugin</artifactId>
                <version>2.16</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-site-plugin</artifactId>
                <version>3.3</version>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

<reporting>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-report-plugin</artifactId>
            <configuration>
                <aggregate>true</aggregate>
                <reportsDirectories>
                    <reportsDirectory>${basedir}/target/surefire-reports</reportsDirectory>
                </reportsDirectories>
            </configuration>
            <reportSets>
                <reportSet>
                    <inherited>false</inherited>
                    <reports>
                        <report>report-only</report>
                    </reports>
                </reportSet>
            </reportSets>
        </plugin>
    </plugins>
</reporting>

我使用mvn clean install site命令构建项目、运行测试并生成网站(使用maven站点插件,该插件又使用maven surefire报告插件生成测试报告)。

问题在于父Pom.xml文件在所有阶段(clean、install和site)执行之前先执行子模块的Pom.xml文件,因此parent中聚合的test1test2测试报告为空。

因此,是否有一种方法可以在单个命令行中执行mvn clean install site,或者必须先执行mvn clean install,然后再执行mvn site

感谢任何建议。

1个回答

23

所展示的配置文件同时将POM作为父级和聚合器。 文档还将讨论继承与多模块。 父级POM向其子级传递值,而聚合器POM管理一组子项目或模块。 《Sonatype Maven Book》的第3.6.2节详细介绍了更多细节。

根据我的经验,当父级和聚合器POM是分离的时,Maven构建运作地更好。

原因与依赖项相关,以及Maven如何确定构建顺序和运行命令有关。 如果您的样本结构像这样,有一个单独的父级和聚合器,其中test1和test2从父级继承:

project (aggregator POM)
  |- parent
  |- test1
  |- test2

假设依赖关系已经正确定义,那么Maven的构建顺序将如下:

  • parent
  • test1
  • test2
  • aggregator

例如执行mvn clean install site命令时,将从父项目开始,清理和构建,安装到本地仓库,然后生成项目站点。它按照所示的每个项目重复此命令序列。因为聚合器是单独的,所以它可能具有单独的配置来执行测试、覆盖率和javadoc的报告聚合。聚合器最后运行,因此模块的覆盖率数据库和中间javadoc文件已经存在,并准备适当地结合起来。

当父项目和聚合器是相同的POM时,构建顺序为:

  • parentAggregator
  • test1
  • test2

现在运行mvn clean install site命令时,Maven必须构建父POM(这里是parentAggregator)以获得依赖于它的子模块所需的信息。parentAggregator也是聚合器,因此Maven将愉快地运行任何汇总报告作为site的一部分。当然,子模块还没有构建,因此不存在覆盖率数据库或中间javadoc文件进行聚合。或者更糟糕的是,旧文件存在,因此聚合器会在这些文件上运行。父聚合器构建完成后,子模块构建,然后退出命令。在构建结束时没有最终的聚合步骤。总体结果可能不是您想要的。

这种现象可能会在多模块项目发布构建期间导致问题,开发人员编写了versions-maven-plugin mojo来帮助解决这些问题。问题如下:

如果您有一个多模块构建,其中聚合POM(即打包类型为pom且模块部分)也是由其子模块引用的父级,并且聚合器版本与子模块的父级部分中指定的版本不匹配,那么Maven将无法让您构建该项目。


2
谢谢您关于聚合器的建议,这是解决这个问题的好方法。而且您还正确预测到“旧文件存在,因此聚合器将对这些文件进行操作” :) - stackoverflower
1
很好的回答!关于聚合器和父级构件的命名约定,有最佳实践吗?(父文件夹应该是 parent 还是 rootconfig?这真的重要吗?) - isnot2bad
太棒了!终于我明白了父级和聚合器之间的区别。谢谢你! - stwissel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接