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。