我正在尝试使用子模块来测试和生成报告,但是遇到了一些问题。
我有以下项目结构:
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
?
感谢您的任何建议。
答案 0 :(得分:16)
显示的配置使用与父和聚合器相同的POM。文档还将讨论继承与多模块。父POM将值传递给其子节点,而聚合器POM管理一组子项目或模块。 Sonatype Maven Book的第3.6.2节详细介绍了这一点。
根据我的经验,当父级和聚合器POM 分开时,Maven可以更好地工作。
原因与依赖关系,Maven如何确定构建顺序以及Maven如何运行命令有关。如果您的示例结构是这样的,使用单独的父级和聚合器,其中test1和test2从父级继承:
project (aggregator POM)
|- parent
|- test1
|- test2
然后Maven构建顺序将如下所示(假设当然正确定义了依赖关系):
像mvn clean install site
这样的命令将从父项目开始,清理和构建,安装到本地工件存储库,然后生成项目站点。它会重复此命令序列,以便显示每个项目。由于聚合器是独立的,因此它可能具有单独的配置来执行测试,覆盖和javadoc的报告聚合。聚合器最后运行,因此模块的coverage数据库和中间javadoc文件已经存在,可以正确组合。
当父级和聚合器与您拥有的POM相同时,构建顺序为:
现在运行mvn clean install site
时,Maven必须构建父POM(此处为parentAggregator),因此它具有子模块所需的信息,具体取决于它。 parentAggregator也是聚合器,因此Maven很乐意在site
中运行任何聚合报告。当然,子模块尚未构建,因此没有要聚合的覆盖数据库或中间javadoc文件。或者,可能更糟糕的是,存在旧文件,因此聚合器对这些文件进行操作。在构建父聚合器之后,构建子模块,然后命令退出。构建结束时没有最终聚合步骤。总体结果可能不是你想要的。
这种现象在多模块项目发布版本中可能会导致问题,开发人员编写versions-maven-plugin mojo来帮助纠正这些问题是非常痛苦的。问题:
如果您有一个多模块构建,其中聚合器pom(即包含pom和模块部分的聚合器)也是其子模块引用的父级,并且聚合器版本与该模块中指定的版本不匹配子模块的父节,Maven不会让你构建项目。