#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
ormaven-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.