1.确认插入点
jacoco统计覆盖率运行流程:
①使用Javaagent部署服务,监听执行指令
②使用jacococli dump覆盖率信息,存储在exec文件中
③使用jacococli 处理exec文件并生成html覆盖率结果报告
步骤①②是对字节码进行处理,较难介入,我们从步骤③介入,在生成报告时排除需要屏蔽的方法
2.功能实现
①参数引入:
通过增加jar运行参数引入需要屏蔽的方法,这里增加参数“--deletedmethod”
②参数处理:
jacoco在org.jacoco.core包中ClassProbsAdapter.java的visitMethod方法进行方法遍历,在这个方法中增加废弃方法判断逻辑,如果是废弃方法则把methodProbes置为EMPTY_METHOD_PROBES_VISITOR
入参name为方法名称,desc为JNI字段描述符描述方法的参数和返回值,这里我们只需要比对JNI字段描述符判断参数即可
3.版本编译
由于jacococli生成报告时用到了jacoco.core中的方法且对其进行了修改,所以需要先编译jacoco.core包,修改jacococli的pom文件,把其中引用的core包替换成本地已经编译好的jar包,我尝试了多次一直无法使用本地jar包打包,索性把maven本地仓库里的包进行替换重新打包成功
4.使用
target目录下生成三个jar包
使用文件:org.jacoco.cli-0.8.7-nodeps.jar
java -jar org.jacoco.cli-0.8.7-nodeps.jar report C:\xxxx\dump.exec --classfiles C:\xxxx\classes\ --sourcefiles C:\xxxxx\src\main\java --html xxxx\html --deletedmethod "com.test.demo.HelloWorld.test2,com.test.demo.HelloWorld.test1(Ljava/lang/String;)"