You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maven多模块项目Jacoco集中式最简配置方案问询

Jacoco Code Coverage in Maven Multi-Module Projects: Configuration & Best Practices

Great question! Let's break this down clearly for your Maven multi-module project using Jacoco.

Core Question: Can I Configure Jacoco Only in the Root POM?

Absolutely! You don’t need to duplicate Jacoco and test plugin configurations across every module’s pom.xml. Maven’s inheritance system lets you set everything up once in your root parent POM, and all child modules will automatically inherit these settings (unless they explicitly override them).

The two common approaches are:

  • Define plugins directly in the root POM’s <build><plugins> section for universal inheritance
  • Use <pluginManagement> to set default versions/configurations, letting child modules opt-in if needed

Two Working Jacoco Coverage Solutions

Solution 1: Per-Module Reports (With Sonar Integration)

This method generates a separate jacoco.exec file for each module, which SonarQube can aggregate into a combined coverage report.

Step 1: Root Project Sonar Properties

Create a sonar-project.properties file in your project root to guide SonarQube to your coverage data:

sonar.projectKey=projectKey
sonar.sources=all source files
sonar.exclusions=someFolders 
sonar.java.coveragePlugin=jacoco
sonar.jacoco.reportPaths=module1/target/jacoco.exec,module2/target/jacoco.exec
sonar.projectName=projectName
sonar.java.binaries=*/target/classes

Step 2: Root POM Maven Configuration

Add this plugin block to your root pom.xml—all child modules will inherit these settings:

<build>
  <plugins>
    <!-- Jacoco Plugin Setup -->
    <plugin>
      <groupId>org.jacoco</groupId>
      <artifactId>jacoco-maven-plugin</artifactId>
      <version>${jacoco-maven-plugin-version}</version>
      <configuration>
        <propertyName>jacoco.agent.argLine</propertyName>
      </configuration>
      <executions>
        <execution>
          <id>jacoco-init</id>
          <goals>
            <goal>prepare-agent</goal>
          </goals>
        </execution>
        <execution>
          <id>jacoco-site</id>
          <phase>verify</phase>
          <goals>
            <goal>report</goal>
          </goals>
        </execution>
      </executions>
    </plugin>

    <!-- Surefire Plugin (Unit Tests) -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>${surefire.plugin.version}</version>
      <configuration>
        <argLine>${jacoco.agent.argLine}</argLine>
        <excludes>
          <exclude>**/integration/**/*.java</exclude>
          <exclude>**/*$*.*</exclude>
        </excludes>
      </configuration>
    </plugin>

    <!-- Failsafe Plugin (Integration Tests) -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-failsafe-plugin</artifactId>
      <version>${failsafe.plugin.version}</version>
      <configuration>
        <argLine>${jacoco.agent.argLine}</argLine>
        <reportsDirectory>${project.build.directory}/surefire-reports</reportsDirectory>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>integration-test</goal>
            <goal>verify</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Solution 2: Combined Report in Root Directory

This approach merges all module-level jacoco.exec files into a single file in the root target folder, creating a unified coverage report.

Add this extra Jacoco execution to your root POM’s Jacoco plugin configuration:

<execution>
  <id>jacoco-aggregate</id>
  <phase>verify</phase>
  <goals>
    <goal>report-aggregate</goal>
  </goals>
  <configuration>
    <dataFileIncludes>**/target/jacoco.exec</dataFileIncludes>
    <outputDirectory>${project.build.directory}/jacoco-aggregate</outputDirectory>
  </configuration>
</execution>

Run mvn verify, and you’ll find the combined HTML report at root/target/jacoco-aggregate/index.html.


Quick Tips for Root POM Configuration

  • Overrides: If a child module needs custom settings (like different test exclusions), it can override the plugin configuration locally without affecting other modules.
  • Plugin Management: Use <pluginManagement> instead of <build><plugins> if you want to define default versions/configurations without forcing all modules to use them—child modules can reference the plugin with minimal code.
  • Lifecycle Order: Jacoco’s prepare-agent goal runs automatically before Surefire/Failsafe execute tests, so you don’t need to manually adjust phase order.

内容的提问来源于stack exchange,提问作者user9835597

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:13:18