# 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
```

###### 3、 其中 org.jacoco.cli-0.8.7-SNAPSHOT-nodeps.jar 为构建出的我们需要的包(我已经构建好,懒得编译从这里下载 [下载地址](https://gitee.com/Dray/jacoco/releases)

###### 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