JaCoCo SonarQube 不兼容版本 1007

JaCoCo SonarQube incompatible version 1007

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

[INFO] [00:00:03.630] Analysing /mySuperProject/target/jacoco.exec -> java.io.IOException: Incompatible version 1007

当我使用调试开关调用 maven 构建时,这个原因被揭示了

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;

这是什么不兼容的更改,为什么会发生? 有解决这个挑战的想法吗?

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

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

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

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

我所做的是在我的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>

这解决了我的问题!

如前所述,这是由于 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

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

运行:

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

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

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

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

对我来说,做 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 生成器 vs. 报告器。

我把 pom.xml 改成了

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

对我有用