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

sta*_*wer 7 java surefire maven

我正在尝试使用子模块来测试和生成报告,但是遇到了一些问题.

我有以下项目结构:

parent
  |-test1
  |-test2
Run Code Online (Sandbox Code Playgroud)

和pom.xml parent看起来像这样:

<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>
Run Code Online (Sandbox Code Playgroud)

mvn clean install site用来构建项目,运行测试并生成一个站点(使用maven站点插件,后者又使用maven surefire报告插件生成测试报告).

问题是在执行子模块的pom.xml之前,父pom.xml与所有阶段(清理,安装和站点)一起执行,因此没有来自test1test2聚合的测试报告parent.

那么,有没有执行的方式mvn clean install site在一个单一的线,或者我绝对要执行mvn clean install第一,然后mvn site

谢谢你的任何建议.

use*_*849 18

显示的配置使用与父和聚合器相同的POM.文档还将讨论继承与多模块.父POM将值传递给其子节点,而聚合器POM管理一组子项目或模块.Sonatype Maven Book的第3.6.2节详细介绍了它.

根据我的经验,当父和聚合器POM 分开时,Maven可以更好地工作.

原因与依赖关系,Maven如何确定构建顺序以及Maven如何运行命令有关.如果您的示例结构是这样的,使用单独的父级和聚合器,其中test1和test2从父级继承:

project (aggregator POM)
  |- parent
  |- test1
  |- test2
Run Code Online (Sandbox Code Playgroud)

那么Maven构建顺序将如下所示(假设当然正确定义了依赖关系):

  • TEST1
  • TEST2
  • 聚合

类似的命令mvn clean install site将从父项目开始,清理和构建,安装到本地工件库,然后生成项目站点.它会重复此命令序列,以便显示每个项目.由于聚合器是独立的,因此它可能具有单独的配置来执行测试,覆盖和javadoc的报告聚合.聚合器最后运行,因此模块的coverage数据库和中间javadoc文件已经存在,可以正确组合.

当父级和聚合器与您拥有的POM相同时,构建顺序为:

  • parentAggregator
  • TEST1
  • TEST2

当你mvn clean install site现在运行时,Maven必须构建父POM(这里是parentAggregator),因此它具有子模块所需的信息,具体取决于它.parentAggregator也是聚合器,因此Maven将乐意运行任何聚合报告作为其中的一部分site.当然,子模块尚未构建,因此没有要聚合的覆盖数据库或中间javadoc文件.或者,可能更糟糕的是,存在旧文件,因此聚合器对这些文件进行操作.在构建父聚合器之后,构建子模块,然后命令退出.构建结束时没有最终聚合步骤.总体结果可能不是你想要的.

这种现象可能会导致多模块项目发布版本中出现问题,开发人员编写版本-maven-plugin mojo以帮助纠正它们时会非常痛苦.问题:

如果您有一个多模块构建,其中聚合器pom(即包含pom和模块部分的那个)也是其子模块引用的父级,并且聚合器版本与在父级部分中指定的版本不匹配.在子模块中,Maven不会让你构建项目.

  • 感谢您对聚合器的建议,这是解决此问题的好方法。而且您还正确地预测到“存在旧文件,因此聚合器可以对那些文件进行操作” :) (2认同)