JaCoCo SonarQube 不兼容版本 1007

Posted

技术标签:

【中文标题】JaCoCo SonarQube 不兼容版本 1007【英文标题】:JaCoCo SonarQube incompatible version 1007 【发布时间】:2015-08-08 04:03:54 【问题描述】:

我正在使用 SonarQube 进行代码质量控制,但突然无法分析原本可以通过的构建并失败。

[INFO] [00:00:03.630] 分析 /mySuperProject/target/jacoco.exec -> java.io.IOException:不兼容的版本 1007

当我使用调试开关调用 maven build 时,这个原因就暴露出来了

Caused by: java.io.IOException: Incompatible version 1007.
at org.jacoco.core.data.ExecutionDataReader.readHeader(ExecutionDataReader.java:127)
at org.jacoco.core.data.ExecutionDataReader.readBlock(ExecutionDataReader.java:107)
at org.jacoco.core.data.ExecutionDataReader.read(ExecutionDataReader.java:87)
at org.sonar.plugins.jacoco.AbstractAnalyzer.readExecutionData(AbstractAnalyzer.java:134)
at org.sonar.plugins.jacoco.AbstractAnalyzer.analyse(AbstractAnalyzer.java:107)

在检查 jacoco ExecutionDataReader 时,我发现从

抛出异常
if (version != ExecutionDataWriter.FORMAT_VERSION) 
    throw new IOException(format("Incompatible version %x.",Integer.valueOf(version)));

从 ExecutionDataWriter 我发现了

/** File format version, will be incremented for each incompatible change. */
public static final char FORMAT_VERSION = 0x1007;

这个不兼容的变化是什么?为什么会这样? 任何想法如何解决这个挑战?

【问题讨论】:

SonarQube java 插件端出现了问题:jira.codehaus.org/browse/SONARJAVA-1091,应该在下一个版本中修复。这是 JaCoCo 方面的重大变化。让我们一点时间来修复它。 【参考方案1】:

如前所述,这是由于 JaCoCo maven 插件代码中断。 您可以(临时)在 jenkins maven 命令中指定版本,例如:

clean org.jacoco:jacoco-maven-plugin:<version>:prepare-agent install

例如

clean org.jacoco:jacoco-maven-plugin:0.7.4.201502262128:prepare-agent install

这是对我们有帮助的解决方法。但和大多数人一样,我仍在等待修复。

【讨论】:

不错的技巧,在有许多子项目的环境中是迄今为止最干净的解决方案 这已在最新版本的 SonarQube Java 插件中得到修复 SonarQube 5.1.1 仍然出现此错误。如何强制使用最新的 SonarQube Java 插件? 必须更新我的 SonarQube 实例中的 Java 插件 /updatecenter/updates【参考方案2】:

我所做的是在我的 maven 项目中指定 jacoco 版本。

<jacoco-maven-plugin.version>0.7.4.201502262128</jacoco-maven-plugin.version>

    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>$jacoco-maven-plugin.version</version>
    </plugin>

这解决了我的问题!

【讨论】:

【参考方案3】:

这很可能是由最新的 jacoco-maven-plugin 更新引起的。一切都在 0.7.4.201502262128 上运行,但今天我们切换到 0.7.5.201505241946 导致了这个错误。

【讨论】:

我也看到了这个。你有更多这方面的信息吗?【参考方案4】:

运行:

mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install
mvn org.jacoco:jacoco-maven-plugin:prepare-agent clean install -Pcoverage-per-test
mvn sonar:sonar

这将重新生成由旧版本 jacoco 创建的 .exec 文件。

【讨论】:

【参考方案5】:

尝试在 SonarQube 更新中心更新 Java 插件,这对我有用。我将 Java 插件从 2.4 版更新到最新的 3.13.1。

SonarQube 更新中心 -> 插件更新 -> Java

【讨论】:

【参考方案6】:

正如 kdowbecki 所提到的,这个错误很可能是由于更新了 jacoco-maven-plugin。

您的 SonarQube 现在很可能正在使用新版本的 Jacoco Maven 插件(可能是新的 0.7.5.201505241946),但实际上正在尝试读取旧版本的 jacoco.exec(在您的情况下,它可能正在读取 jacoco. exec 由 jacoco maven 插件版本 0.7.4.201502262128 生成),这会导致 JaCoCo 引发不兼容。

要解决此问题,您应该确保您的所有 SonarQube/Jenkins 作业每次都生成 JaCoCo 报告,并且不要依赖可能由以前的作业生成的旧版本 jacoco.exec。

【讨论】:

【参考方案7】:

对我来说,在做mvn install

Error while creating report: Cannot read execution data version 0x1006. This version of JaCoCo uses execution data version 0x1007

意味着我已经完成了原型生成,但原型意外地包含了包含旧 jacoco 文件的目标目录(或者它已被意外签入 git)。首先做一个 mvn clean (并检查)解决了这个问题。当没有要运行的单元测试或类似的东西时,猜测 jacoco 不愿意用新文件覆盖 jacoco.exec 文件,因此旧文件被保留并尝试用于 jacoco 报告。 FWIW...

一般来说,它表示生成器与报告器的version mismatch。

【讨论】:

【参考方案8】:

我把 pom.xml 改成了

groupId=org.jacoco
artifactId=jacoco-maven-plugin
version=0.8.4-SNAPSHOT

对我有用

【讨论】:

以上是关于JaCoCo SonarQube 不兼容版本 1007的主要内容,如果未能解决你的问题,请参考以下文章

SonarQube + Jacoco - 无法读取 Koin 模块测试覆盖率

Jacoco和SonarQube的测试覆盖率不一样

SonarQube 和 JaCoCo (maven) 命名约定

SonarQube Jacoco离线仪器在Maven Multi Module Project中显示0%的覆盖率

jacoco 分支覆盖和声纳条件覆盖有啥区别?

Sonar是否使用Jacoco插件进行代码覆盖