# jacoco **Repository Path**: afanfengping/jacoco ## Basic Information - **Project Name**: jacoco - **Description**: jacoco二开,支持增量代码覆盖率 - **Primary Language**: Unknown - **License**: EPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 124 - **Created**: 2022-03-02 - **Last Updated**: 2024-06-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 简介 + jacoco二开,主要加入了增量代码匹配的功能 具体设计方案参考 [jacoco增量代码实践](https://blog.csdn.net/tushuping/article/details/112613528) ### 改造内容: + 新增类:所有新增类处于org.jacoco.core.internal.diff包下面; + 修改类:主要修改了核心类org.jacoco.core.analysis.Analyzer,org.jacoco.core.analysis.CoverageBuilder;org.jacoco.core.internal.flowClassProbesAdapter + 所有修改内容在commit记录可查,为了方便查看,我尽量减少了commit的次数 ### 运行环境 #### 1、Maven 版本:3.3.9 #### 2、JDK 版本:1.8.0 ### 使用方法 ###### 1、 下载源码后,先运行如下命令。jacoco 进行了文件头文件校验,如果新加入了类或者修改了类,需要重新校验,所以要先运行此命令 ```shell mvn spotless:apply ``` ###### 2、 运行构建命令 若需每次强制更新,可在命令后添加 “-U” 参数 ```shell mvn clean package # 或者跳过测试和doc mvn clean package -Dmaven.test.skip=true -Dmaven.javadoc.skip=true ``` ![构建结果展示](./imgs/build.png) ###### 3、 其中 org.jacoco.cli-0.8.7-SNAPSHOT-nodeps.jar 为构建出的我们需要的包(我已经构建好,懒得编译从这里下载 [下载地址](https://gitee.com/Dray/jacoco/releases) ![构建包](./imgs/jacoco-cli-nodes.png) ###### 4、 其他包都可以使用 jacoco 官方包,但是版本最好保持一致,也可以用自己构建出的包,report 时使用我们构建的包,如果是增量覆盖率加入参数 ``` --diffCode="[{\"classFile\":\"com/dr/code/diff/config/GitConfig\",\"methodInfos\":[{\"methodName\":\"cloneRepository\",\"parameters\":\"String gitUrl,String codePath,String commitId\"},{\"methodName\":\"diffMethods\",\"parameters\":\"DiffMethodParams diffMethodParams\"},{\"methodName\":\"getClassMethods\",\"parameters\":\"String oldClassFile,String mewClassFile,DiffEntry diffEntry\"}],\"type\":\"MODIFY\"},{\"classFile\":\"com/dr/code/diff/controller/CodeDiffController\",\"methodInfos\":[{\"methodName\":\"getList\",\"parameters\":\"@ApiParam(required = true, name = \\\"gitUrl\\\", value = \\\"git远程仓库地址\\\") @RequestParam(value = \\\"gitUrl\\\") String gitUrl,@ApiParam(required = true, name = \\\"baseVersion\\\", value = \\\"git原始分支或tag\\\") @RequestParam(value = \\\"baseVersion\\\") String baseVersion,@ApiParam(required = true, name = \\\"nowVersion\\\", value = \\\"git现分支或tag\\\") @RequestParam(value = \\\"nowVersion\\\") String nowVersion\"}],\"type\":\"MODIFY\"},{\"classFile\":\"com/dr/code/diff/service/impl/CodeDiffServiceImpl\",\"methodInfos\":[{\"methodName\":\"getDiffCode\",\"parameters\":\"DiffMethodParams diffMethodParams\"}],\"type\":\"MODIFY\"},{\"classFile\":\"com/dr/common/utils/string/ScmStringUtil\",\"methodInfos\":[],\"type\":\"ADD\"}]" ``` 由于对象格式的通用性,可以配合 [差异代码获取](https://gitee.com/afanfengping/code-diff.git) 一起使用 ###### 5、关于生成多模块工程中 jacoco 报告命令参考 demo,其中 diffcode 传递的参数为 diffcode 服务返回的 uniqueData 字段,已进行转义和压缩直接使用 : ```shell java -jar org.jacoco.cli-0.8.7-SNAPSHOT-nodeps.jar report jacoco.exec --classfiles \Desktop\feigin\web\build\classes --classfiles \Desktop\feigin\biz\build\classes --classfiles \Desktop\feigin\base\build\classes --sourcefiles \Desktop\feigin\web\src\main\java --sourcefiles \Desktop\feigin\biz\src\main\java --sourcefiles \Desktop\feigin\base\src\main\java --html report --xml jacoco.xml --diffCode=[{ "classFile": "com/vx/crm/web/swagger/SwaggerConfig", "methodInfos": [ { "methodName": "apiInfo", "parameters": "" } ], "type": "MODIFY" }] --encoding=utf8 ``` ### 问题汇总 #### 1、jacoco报告如存在乱码问题: 请执行命令时带入参数 --encoding=utf8 #### 2、MavenReportException: Error while generating Javadoc 因注释不遵循 Javadoc 的注释格式检查规则引起的错误,通过配置关闭对应的检查项即可。 org.jacoco.build 中的 pom.xml ```xml org.apache.maven.plugins maven-javadoc-plugin 3.0.1 true false none ``` #### 3、[ERROR] net.alchim31.maven:scala-maven-plugin:4.4.0:compile: java.lang.NoSuchMethodError: org.fusesource.jansi.AnsiConsole.wrapOutputStream(Ljava/io/OutputStream;)Ljava/io/OutputStream; 错误信息详情如下所示 ```text [ERROR] Failed to execute goal net.alchim31.maven:scala-maven-plugin:4.4.0:compile (compile) on project org.jacoco.core.test.validation.scala: Execution compile of goal net.alchim31.maven:scala-maven-plugin:4.4.0:compile failed: An API incompatibility was encountered while executing net.alchim31.maven:scala-maven-plugin:4.4.0:compile: java.lang.NoSuchMethodError: org.fusesource.jansi.AnsiConsole.wrapOutputStream(Ljava/io/OutputStream;)Ljava/io/OutputStream; ``` 第一种:使用 maven 3.3.9 第二种:将 org.jacoco.build 的工程文件 pom.xml 中 modules 的子节点 ../org.jacoco.tests 注释掉 #### 4、构建单元测试失败 原因为本地无相应的测试文件,故而简单将相应的测试类注释掉 1、org.jacoco.cli.test --- org.jacoco.cli.internal.commands.MergeTest.local_should_merge_exec_files 2、org.jacoco.cli.test --- org.jacoco.cli.internal.commands.ReportTest.mytest 3、org.jacoco.cli.test --- org.jacoco.cli.internal.commands.ReportTest.mytest2