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

如何在Jacoco分析中排除加密Jar?配置excludes仍报ClassNotFound

解决Jacoco代码覆盖率分析时加密Jar引发的ClassNotFoundException问题

我遇到过类似的问题,你配置的<excludes>没生效的核心原因是:Jacoco插件configuration里的<excludes>是用来排除你自己项目编译生成的类,而加密Jar属于外部依赖类,这个配置对它完全不起作用。下面给你几个可行的解决方案:

方案1:通过Jacoco Agent参数排除依赖类

这是最直接有效的方法,我们需要在Jacoco的agent参数里指定要排除的外部类包,而不是用插件的<excludes>节点。修改你的插件配置如下:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>jacoco-prepare-agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <!-- 配置agent的excludes参数,排除加密Jar的所有类 -->
                <argLine>-javaagent:${jacoco.agent.jar}=excludes=com.companyname.**</argLine>
            </configuration>
        </execution>
        <execution>
            <id>jacoco-report</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

这里的关键是excludes=com.companyname.**:

  • 用点.分隔包名,和Java的包名格式一致
  • **是通配符,会匹配com.companyname下的所有子包和类

方案2:确认排除规则的准确性

如果方案1没生效,先检查这两点:

  • 加密Jar里的类实际包名是不是com.companyname开头?可以解压Jar查看里面的class文件路径,确保和你写的排除规则匹配
  • 如果你要排除整个Jar的所有类,确保规则覆盖了所有包,比如如果Jar里还有com.companyname.utils这类子包,com.companyname.**就能全部匹配到

方案3:调整依赖作用域(按需使用)

如果这个加密Jar只在生产环境运行时需要,测试阶段完全用不到,可以把它的Maven依赖作用域改成runtime:

<dependency>
    <groupId>com.companyname</groupId>
    <artifactId>encrypted-jar</artifactId>
    <scope>runtime</scope>
</dependency>

这样Maven在编译和测试阶段不会把这个Jar加入类路径,Jacoco自然也就不会去加载它了。但如果你的测试代码依赖这个Jar里的类,这个方法就不适用。

配置完成后,运行mvn clean test jacoco:report重新执行测试和覆盖率分析,应该就能解决ClassNotFoundException的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:54:44