不兼容的1007版本

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

[ INFO ][00:00:03.630]分析/mySuperProject/target/jacoco.exec-> 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 ExectionDataReader 时,我发现异常是从

if (version != ExecutionDataWriter.FORMAT_VERSION) {
throw new IOException(format("Incompatible version %x.",Integer.valueOf(version)));
}

从 ExectionDataWriter 我发现

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

这个 不相容的改变是什么? 为什么会发生? 有什么办法解决这个挑战吗?

31395 次浏览

很可能是最新的 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 插件代码中断。 您可以(暂时)在 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

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

尝试在 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...

一般来说,它意味着 版本不匹配的发生器与报告。

我修改了 pom.xml

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

对我很有效