JaCoCo 报告生成时发生错误

问题描述 投票:0回答:5

我目前正在尝试添加 JaCoCo 作为我的 Spring Boot Maven 项目的依赖项,以查看单元测试的代码覆盖率。但是,当我运行测试时,它失败并出现错误。

 Failed to execute goal org.jacoco:jacoco-maven-plugin:0.8.3:report (report) on project test-rest-service: An error has occurred in JaCoCo report generation. Error while creating report: malformed input around byte 2 -> [Help 1]

所有测试均顺利通过,因此这不是问题。

JaCoCo 的依赖是:

   <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.3</version>
            <executions>
                <execution>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
                <execution>
                    <id>report</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
            </executions>
    </plugin>

JaCoCo.exec 文件已生成,但我无法打开它来生成报告。我究竟做错了什么?

java maven jacoco jacoco-maven-plugin
5个回答
13
投票

我也遇到过类似的问题。尽管这个问题已经有几个月了,但我还是在写这篇文章,因为弄清楚这个问题非常耗时,而且没有多少谷歌搜索能给我提供直接的答案,而只能找到我必须自己拼凑的线索。


就我而言,错误大约每三个构建发生一次。错误也不总是与这个问题中所述相同:字节数正在变化,有时我只是得到一个 EOFException 。

我的评估中有一定程度的猜测。以下是我调查的底线:

  • 该错误似乎是由于 JaCoCo 无法(完全)写入
    JaCoCo.exec
    文件而发生的,可能是由于相应的 VM 在写入操作完成(或开始)之前被终止。请注意,JaCoCo 仅在虚拟机退出时才写入该文件。
  • 如果您进行多线程处理,则可能会发生这种情况,因为线程仍在后台运行,导致
    maven-surefire-plugin
    maven-failsafe-plugin
    超时触发。确保所有线程都运行完成。
  • 如果问题是由计算机异常缓慢引起的,您应该能够通过将
    forkedProcessExitTimeoutInSeconds
    选项设置为大于默认
    30
    秒(或大于当前设置的值)的值来解决该问题在您的
    maven-surefire-plugin
    maven-failsafe-plugin
    中。这是我的情况,因为我被迫在一个非常慢且内存受限的虚拟机上运行构建。
  • 确保
    forkCount
    0
    中的
    maven-surefire-plugin
    属性大于
    maven-failsafe-plugin
    ,并且
    forkMode
    NOT 设置为
    never
    ,因为 JaCoCo 需要处理分叉进程,以便文件被写入,因此随后被拾取。

示例片段:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
    <configuration>
        <forkedProcessExitTimeoutInSeconds>60</forkedProcessExitTimeoutInSeconds>
        <forkCount>1</forkCount>
    </configuration>
</plugin>

参考资料:


12
投票

至少就我而言,它更简单。我只需要运行 mvn clean verify 一切就又恢复正常了,没有任何问题。


4
投票

就我而言,该错误并不是很有帮助:

Execution jacoco-site of goal org.jacoco:jacoco-maven-plugin:0.8.3:report-aggregate failed: malformed input off : 61255, length : 1: Input length = 1 -> [Help 1]

我必须调试插件执行,发现 org.jacoco.core.analysis.Analyzer 正在从我在那里的 target/classes 文件夹中挑选非 .class 文件,例如模板等。其中一些文件引发了 MalformedInputException 关于不正确的字符集。修复方法是在插件配置中仅包含 .class 文件:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <configuration>
      <includes>
        <include>**/*.class</include>
      </includes>
    </configuration>
</plugin>

2
投票

在我的例子中,字节数已更改为 32。对我来说,运行命令 mvn clean install 有效。我必须为我的项目运行此命令,然后成功生成 Jacoco 报告。


0
投票

只需删除 /target 文件夹中的 jacoco.exec 即可正常工作!

© www.soinside.com 2019 - 2024. All rights reserved.