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

b5buobof  于 2023-10-17  发布在  Maven
关注(0)|答案(1)|浏览(171)

我试图得到与子模块项目进行测试,并正确生成报告,但有一些问题。
我有以下项目结构:

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 site plugin,而maven site plugin又使用maven surefire report plugin来生成测试报告)。

问题是父pom.xml在子模块的pom.xml执行之前的所有阶段(clean,install和site)都执行过,因此test1test2的测试报告不会聚合到parent中。

那么有没有办法在一行代码中执行mvn clean install site,或者我必须先执行mvn clean install,然后再执行mvn site
感谢您的任何建议。

sh7euo9m

sh7euo9m1#

显示的配置使用与父级和聚合器相同的POM。文档还将讨论继承与多模块。父POM将值传递给其子POM,而聚合器POM管理一组子项目或模块。Sonatype Maven Book的第3.6.2节详细介绍了更多细节。
根据我的经验,当父POM和聚合器POM * 分离 * 时,Maven构建工作得更好。
原因与依赖关系、Maven如何确定构建顺序以及Maven如何运行命令有关。如果你的示例结构是这样的,有一个单独的父级和聚合器,其中test1和test2继承自父级:

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

那么Maven的构建顺序将是这样的(当然,假设依赖关系定义正确):

  • test1
  • test2
  • 聚合器

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将不允许您构建项目。

相关问题