如何在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
相关产品推荐
相关产品推荐

