我有类似的项目结构 - 主要代码在一个模块中并在另一个模块中测试 - 并且在 jacoco 报告中遇到了类似的问题。
我的解决方案 1:
只需将/classes 文件夹复制到maven-resources-plugin 的测试模块即可。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>copy-classes-to-test-module</id>
<goals>
<goal>testResources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>${project.basedir}/../main-module/target/classes</directory>
</resource>
</resources>
<outputDirectory>
${project.build.outputDirectory}
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
但是如果你的代码中包含了 lambdas、匿名类等,那么结果报告可能不会涵盖某些类,因为由于prepare-agent 运行的不同,它会是不同的类。
我的解决方案 2:
使用report-aggregate 目标。
在父 POM 中我有这样的配置:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.3</version>
<configuration>
<append>true</append>
</configuration>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
</plugin>
测试模块的 POM 包含以下几行:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<executions>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report-aggregate</goal>
</goals>
</execution>
</executions>
</plugin>
请记住,依赖范围对于 report-aggregate 目标 (jacoco docs) 很重要。如果您的测试模块只有测试范围的依赖项,您将得到一个空报告。因此,您应该将范围设置为编译、运行时或为您希望在报告中看到的那些工件提供。例如:
<dependency>
<groupId>my.project</groupId>
<artifactId>main-module-classes</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
</dependency>