Произошла ошибка при генерации отчета JaCoCo

#java #maven #jacoco #jacoco-maven-plugin

#java #maven #jacoco #jacoco-maven-plugin

Вопрос:

В настоящее время я пытаюсь добавить 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 создан, но я не могу открыть его для генерации отчета. Что я делаю не так?

Комментарии:

1. Я тоже целый день ломал голову над этой проблемой. Это помогло бы иметь весь pom.xml чтобы увидеть, была ли какая-либо общность. Кроме того, было бы полезно узнать, какой набор внесенных вами изменений привел к возникновению проблемы. В моем случае, вероятно, речь идет об исполнителе, используемом в Spring совместно с @Async, но, похоже, я не могу найти способ заставить его работать.

Ответ №1:

У меня была похожая проблема. Я пишу, хотя вопросу уже несколько месяцев, поскольку на его выяснение ушло очень много времени, и никакое количество поисковых запросов в Google не дало мне прямого ответа, а только подсказки, которые мне пришлось собирать самому.


В моем случае ошибка происходила примерно раз в три сборки. Ошибка также не всегда была такой же, как указано в этом вопросе: номер байта менялся, и иногда вместо этого я просто получал исключение EOFException.

В моей оценке есть определенная доля догадок. Здесь следует итог моего расследования:

  • Ошибка, по-видимому, возникает в результате того, что JaCoCo не может (полностью) записать JaCoCo.exec файл, вероятно, из-за того, что соответствующая виртуальная машина была завершена до завершения (или запуска) операции записи. Следует отметить, что JaCoCo записывает указанный файл только при выходе из виртуальной машины.
  • Если вы выполняете многопоточность, это может произойти из-за того, что поток, все еще работающий в фоновом режиме, вызывает тайм-аут для запуска maven-surefire-plugin или maven-failsafe-plugin . Убедитесь, что все ваши потоки выполняются до завершения.
  • Если проблема вызвана необычной медлительностью вашего компьютера, вы должны быть в состоянии устранить проблему, установив для forkedProcessExitTimeoutInSeconds параметра значение, большее, чем 30 секунды по умолчанию (или иным образом большее, чем то, что вы установили в данный момент) в вашем maven-surefire-plugin или maven-failsafe-plugin . Это был мой случай, поскольку я был вынужден запускать сборку на очень медленной виртуальной машине с ограниченным объемом памяти.
  • Убедитесь, что forkCount свойство больше, чем 0 в вашем maven-surefire-plugin or maven-failsafe-plugin , и для него forkMode НЕ установлено значение 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>
  

Ссылки:

Комментарии:

1. Вы лучший, спасибо

Ответ №2:

По крайней мере, в моем случае это было более просто. Мне просто нужно было запустить mvn clean verify, и все снова заработало без каких-либо проблем.

Ответ №3:

В моем случае ошибка была не очень полезной:

 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.Анализатор выбирал файлы, отличные от .class, из целевой папки / classes, которые у меня там были, например, Шаблоны и т.д. Некоторые из них вызывали MalformedInputException из-за неправильного набора символов. Исправление состояло в том, чтобы включить только файлы .class в конфигурацию плагина:

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

Ответ №4:

В моем случае номер байта был изменен и стал 32. Для меня сработала команда mvn clean install. Мне пришлось запустить эту команду для моего проекта, а затем успешно сгенерировать отчет Jacoco.