【问题标题】:JaCoCo report fails in Jenkins: java.lang.ArrayIndexOutOfBoundsExceptionJaCoCo 报告在 Jenkins 中失败:java.lang.ArrayIndexOutOfBoundsException
【发布时间】:2015-02-23 16:36:16
【问题描述】:

我一直在本地使用 JaCoCo,没有问题。

在远程服务器上运行 Jenkins 作业时,该作业构建良好并生成 JaCoCo 覆盖率报告(即它出现在我的 workspace/report 文件夹中),但尝试在 Jenkins 上发布报告时构建失败。

我正在使用 Jenkins 1.460 和 JaCoCo 5.0.0。

我已经为 Jenkins 配置了:

  • 执行文件的路径:**/**.exec
  • 类路径:**/dist/validation/WEB-INF/classes
  • 源路径:**/src(我也尝试过**/Validation/src,明确包括**/**.class,不包括其他文件类型)

这是配置问题,还是兼容性错误?

[编辑:如果它对其他人有帮助,其他论坛说 JaCoCo 需要 ASM 5.+ 来管理 Java 8 类分析。我已经在使用 ASM 5.0.1。]

BUILD SUCCESSFUL
Total time: 4 minutes 57 seconds
Archiving artifacts
Recording test results
[JaCoCo plugin] Collecting JaCoCo coverage data...
[JaCoCo plugin] **/**.exec;**/dist/validation/WEB-INF/classes;**/Validation/src; locations are configured
[JaCoCo plugin] Number of found exec files for pattern **/**.exec: 1
[JaCoCo plugin] Saving matched execfiles:  E:\Jenkins\jobs\Validation - Test Cases\workspace\Validation\jacoco.exec
[JaCoCo plugin] Saving matched class directories for class-pattern: **/dist/validation/WEB-INF/classes:  E:\Jenkins\jobs\Validation - Test Cases\workspace\Validation\dist\validation\WEB-INF\classes
[JaCoCo plugin] Saving matched source directories for source-pattern: **/Validation/src:  E:\Jenkins\jobs\Validation - Test Cases\workspace\Validation\src
[JaCoCo plugin] Loading inclusions files..
[JaCoCo plugin] inclusions: []
[JaCoCo plugin] exclusions: []
ERROR: Publisher hudson.plugins.jacoco.JacocoPublisher aborted due to exception
java.io.IOException: Error while analyzing class E:\Jenkins\jobs\Validation - Test Cases\builds\2015-02-23_15-59-44\jacoco\classes\org\gosh\validation\filters\ModifiedFileListFilter.class.
    at org.jacoco.core.analysis.Analyzer.analyzerError(Analyzer.java:150)
    at org.jacoco.core.analysis.Analyzer.analyzeClass(Analyzer.java:144)
    at org.jacoco.core.analysis.Analyzer.analyzeAll(Analyzer.java:175)
    at org.jacoco.core.analysis.Analyzer.analyzeAll(Analyzer.java:208)
    at hudson.plugins.jacoco.ExecutionFileLoader.analyzeStructure(ExecutionFileLoader.java:126)
    at hudson.plugins.jacoco.ExecutionFileLoader.loadBundleCoverage(ExecutionFileLoader.java:133)
    at hudson.plugins.jacoco.JacocoReportDir.parse(JacocoReportDir.java:102)
    at hudson.plugins.jacoco.JacocoBuildAction.loadRatios(JacocoBuildAction.java:291)
    at hudson.plugins.jacoco.JacocoBuildAction.load(JacocoBuildAction.java:273)
    at hudson.plugins.jacoco.JacocoPublisher.perform(JacocoPublisher.java:371)
    at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:19)
    at hudson.model.AbstractBuild$AbstractRunner.perform(AbstractBuild.java:705)
    at hudson.model.AbstractBuild$AbstractRunner.performAllBuildSteps(AbstractBuild.java:680)
    at hudson.model.AbstractBuild$AbstractRunner.performAllBuildSteps(AbstractBuild.java:658)
    at hudson.model.Build$RunnerImpl.post2(Build.java:162)
    at hudson.model.AbstractBuild$AbstractRunner.post(AbstractBuild.java:627)
    at hudson.model.Run.run(Run.java:1446)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
    at hudson.model.ResourceController.execute(ResourceController.java:88)
    at hudson.model.Executor.run(Executor.java:238)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 7
    at org.jacoco.core.internal.analysis.MethodAnalyzer.addProbe(MethodAnalyzer.java:288)
    at org.jacoco.core.internal.analysis.MethodAnalyzer.visitInsnWithProbe(MethodAnalyzer.java:224)
    at org.jacoco.core.internal.flow.MethodProbesAdapter.visitInsn(MethodProbesAdapter.java:76)
    at org.objectweb.asm.tree.InsnNode.accept(InsnNode.java:80)
    at org.objectweb.asm.tree.InsnList.accept(InsnList.java:162)
    at org.objectweb.asm.tree.MethodNode.accept(MethodNode.java:815)
    at org.jacoco.core.internal.flow.ClassProbesAdapter$1.visitEnd(ClassProbesAdapter.java:124)
    at org.objectweb.asm.ClassReader.b(Unknown Source)
    at org.objectweb.asm.ClassReader.accept(Unknown Source)
    at org.objectweb.asm.ClassReader.accept(Unknown Source)
    at org.jacoco.core.analysis.Analyzer.analyzeClass(Analyzer.java:107)
    at org.jacoco.core.analysis.Analyzer.analyzeClass(Analyzer.java:142)
    ... 18 more
Finished: FAILURE

[更新 - 解决方案]

使用this answer 我在本地驱动器上安装了最近发布的JaCoCo-0.7.4(请参阅eclemma.org/jacoco)。此版本包含对issue 27088 的修复。我还必须删除然后重新安装 Jenkins JaCoCo 插件(我使用了 Jenkins 插件管理器)。

【问题讨论】:

    标签: java jenkins code-coverage jacoco emma


    【解决方案1】:

    构建期间使用的 JaCoCo 版本与构建后操作中 Jenkins 使用的版本之间似乎存在兼容性问题。

    maven-jacoco-plugin 版本 0.7.3.201502191951 与 Jenkins JaCoCo 插件版本 1.0.18 结合使用会导致此问题。 maven-jacoco-plugin 的 0.7.2.201409121644 版本似乎兼容。

    另请参阅https://issues.jenkins-ci.org/browse/JENKINS-27088https://github.com/jenkinsci/jacoco-plugin/pull/51

    【讨论】:

    • 谢谢 - 请您进一步解释我如何解决这种不兼容问题?我尝试过手动安装 JaCoCo,并通过 Jenkins 的插件管理器。自动安装程序为我提供 JaCoCo 1.0.18,以及所有其他模块(org.jacoco.agentjacoco-maven-pluginorg.jacoco.reportorg.jacoco.core),版本为 0.7.1.201405082137 - 实际上是一个名为 ${jacoco.version} 的属性。如何管理这些依赖项?
    • 更新 - 我创建了一个骨架作业,确认我的 JaCoCo 和 Jenkins 版本是兼容的,所以这不是问题。
    • 它只发生在某些 Java 代码中,方法中的可变参数可能会导致这种情况。由于还没有更新的 Jenkins jacoco-plugin 可用,您最好的选择是将项目中的 JaCoCo 降级到 0.7.3 之前的版本,或者使用来自 jenkins.ci.cloudbees.com/job/plugins/job/jacoco-plugin/75/… 的 Jenkins 插件的快照构建
    • 不幸的是,没有运气。
    • 我再次尝试,在我的本地驱动器上安装最近发布的 JaCoCo-0.7.4(请参阅eclemma.org/jacoco)。此版本包含对上述问题 #51 的修复。我还必须删除然后重新安装 Jenkins JaCoCo 插件(我使用了 Jenkins 插件管理器)。我的报告现在正在 Jenkins 上发表。我有一个空白覆盖图,但我认为这是一个单独的问题。
    【解决方案2】:

    两件事: 在 JaCoCo 构建后操作的 Jenkins 项目配置中,确保设置包含字段。像 */*.class 这样的东西应该可以工作。还要从上面的表达式中删除第二个星号 (*)。使它们成为 */*.exec、*/dist/ 等

    我今天从 Jacoco 插件中遇到了类似的 ArrayIndexOutOfBounds 异常,但它只发生在 Jenkins 中,而不是从命令行运行 maven 构建时发生。谷歌搜索表明 Jacoco 插件包含和排除字段语法会导致人们出现问题。我为这些字段尝试了几种不同的格式,但无济于事,所以我转而使用 cobertura 插件,这很容易使用:https://wiki.jenkins-ci.org/display/JENKINS/Cobertura+Plugin#CoberturaPlugin-ConfiguringtheCoberturaPlugin

    【讨论】:

    • 如果您认为 Jacoco 插件很烂,或许您可以详细说明原因?请注意,我对此没有任何意见,我只是认为这样的论点应该带有解释。
    • 上个月我尝试让 Cobertura 工作,最后得出的结论是 Cobertura 仍然与 Java 7+ 不兼容。出于这个原因,我正在切换到 JaCoCo。我在网上找不到任何表明 Cobertura 已更新的信息,所以很遗憾,我无法使用此选项。
    • 感谢您关于显式包含的建议。我应该说我已经尝试过包含**/**.class 并排除(例如)**/**.xsd** 与其他配置设置配合得很好,所以我认为这不会导致问题。
    • 谷歌搜索导致提示**可能导致问题并且您需要输入包含和排除字段的值的线程。一旦我这样做了,Jacoco Jenkins 插件就会停止抛出 ArrayIndexOutOfBounds 异常,所以我认为我在正确的轨道上,那就是当我发布到你的问题时。不过,我在查看我的类文件时仍然遇到问题,所以我休息了一下并加载了 Cobertura 插件,只需将其添加到我的 maven pom 即可几乎立即运行。我使用 Java 7 构建,Cobertura 没有问题。
    • @Magnilex,我可能不应该直接跳到“Jenkins Jacoco 插件很烂”。我更新了我的答案,以更好地反映我搬到 cobertura 的原因。
    猜你喜欢
    • 2016-01-03
    • 2020-02-16
    • 2015-10-04
    • 2018-09-13
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    相关资源
    最近更新 更多