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

标签 java maven surefire

我正在尝试让带有子模块的项目正确测试和生成报告,但遇到了一些问题。

我有以下项目结构:

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 之前,父 pom.xml 在所有阶段(清理、安装和站点)执行,因此没有来自 test1 的测试报告。和 test2聚合在 parent .

那么有没有办法执行mvn clean install site在一行中,还是我绝对必须执行 mvn clean install先然后mvn site

感谢您的任何建议。

最佳答案

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

根据我的经验,当父 POM 和聚合器 POM 分开时,Maven 构建工作得更好。

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

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

然后 Maven 构建顺序将如下所示(当然假设依赖项定义正确):

  • parent
  • 测试1
  • 测试2
  • 聚合器

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

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

  • parentAggregator
  • 测试1
  • 测试2

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

这种现象可能会在多模块项目发布构建期间引起问题,非常痛苦,以至于开发人员编写了一个 versions-maven-plugin mojo帮助纠正他们。问题:

If you have a multi-module build where the aggregator pom (i.e. the one with packaging of pom and the modules section) is also the parent referenced by its child modules, and the aggregator version does not match the version specified in the parent section of the child modules, Maven will not let you build the project.

关于java - 多模块项目的 Maven 报告和站点生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21585037/

相关文章:

java - 如何在 Spring Boot wicket 应用程序中注入(inject) RequestScope bean

Java Scanner 用空行分割记录

java - 使用reuseForks配置maven-surefire插件

java - 为什么对象类不采用 null

java - Spark 连接器错误 : WARN NettyUtil: Found Netty's native epoll transport, 但未在基于 linux 的操作系统上运行。改用 NIO

java - 构建项目gradle时出现错误: Connection timed out: connect ?

java - 在Eclipse中构建Maven项目时出现错误,退出命令提示符后还检查maven版本

maven - 使用位于 src/test/java 中的 Maven 运行 Spock 测试

java - 如何获取测试资源文件?

java - 是否可以创建 XSL 转换器输出流?