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

解决Jacoco在Quarkus应用mvn test时排除类不生效问题

问题原因分析

核心问题在于Quarkus测试的JVM Fork机制和Maven生命周期阶段的差异:

  1. Maven阶段差异:mvn clean install会执行到verify阶段,此时Jacoco的report和check目标触发,这两个目标里的<excludes>配置会在生成覆盖率报告时过滤指定类,所以你看到排除生效。而mvn test仅执行到test阶段,不会触发report/check,如果此时查看的是原始Jacoco exec文件(未经过报告过滤),或依赖插桩阶段的排除,就会出现类未被排除的情况。

  2. Quarkus测试的Fork特性:Quarkus的quarkus-maven-plugin:test目标默认会fork独立JVM运行测试,你配置的Jacoco prepare-agent参数(包括<excludes>)仅传递给Maven主JVM,不会自动同步到fork的测试JVM中。这导致测试JVM里的Jacoco agent未应用排除规则,依然对目标类进行插桩和统计。

解决方案

针对上述问题,有两种可行修复方式:

方式一:让Jacoco Agent参数传递到Fork的测试JVM

修改Jacoco prepare-agent配置,将agent参数绑定到maven.test.args属性——Quarkus测试插件会继承该属性参数,让fork的JVM也应用排除规则:

<execution>
    <id>prepare-agent</id>
    <goals>
        <goal>prepare-agent</goal>
    </goals>
    <configuration>
        <exclClassLoaders>*QuarkusClassLoader</exclClassLoaders>
        <excludes>
            <exclude>org/quarkus/configurations/**</exclude>
        </excludes>
        <destFile>${project.build.directory}/jacoco-quarkus.exec</destFile>
        <append>true</append>
        <!-- 将agent参数绑定到maven.test.args,让Quarkus测试插件继承 -->
        <propertyName>maven.test.args</propertyName>
    </configuration>
</execution>

方式二:直接在Quarkus测试插件中配置Jacoco参数

在quarkus-maven-plugin的test执行配置中,直接指定Jacoco agent参数,确保fork的测试JVM加载agent时应用排除规则:

<plugin>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-maven-plugin</artifactId>
    <version>${quarkus.version}</version>
    <executions>
        <execution>
            <goals>
                <goal>test</goal>
            </goals>
            <configuration>
                <systemPropertyVariables>
                    <!-- 指定Jacoco agent的输出文件和排除规则 -->
                    <jacoco-agent.destfile>${project.build.directory}/jacoco-quarkus.exec</jacoco-agent.destfile>
                    <jacoco-agent.excludes>org/quarkus/configurations/**</jacoco-agent.excludes>
                    <jacoco-agent.exclClassLoaders>*QuarkusClassLoader</jacoco-agent.exclClassLoaders>
                </systemPropertyVariables>
            </configuration>
        </execution>
    </executions>
</plugin>

额外验证建议

  • 执行mvn test jacoco:report手动触发报告生成,验证排除规则是否生效——这可以确认是插桩阶段还是报告阶段的问题。
  • 检查target/jacoco-quarkus.exec文件的生成情况,确保测试后该文件存在且符合预期。

内容的提问来源于stack exchange,提问作者Sergio Agüero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:06:07