JaCoCo SonarQube不兼容版本1007

我使用SonarQube进行代码质量控制,并突然build立,否则将无法分析和失败。

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

当我用debugging开关调用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时,我发现这个exception是从中抛出的

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

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

我所做的是在我的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-plugin更新造成的。 一切工作在0.7.4.201502262128,但今天我们切换到0.7.5.201505241946导致这个错误。

跑:

 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创build的.exec文件。

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

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

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

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

为了解决这个问题,你应该确保所有的SonarQube / Jenkins作业每次都生成一个JaCoCo报告,而不要依赖以前作业可能生成的旧版本的jacoco.exec。