JaCoCo с Maven - отсутствует файл данных выполнения

У нас есть многомодульный проект Maven, состоящий из родителя (HelloWorld) и разных потомков (HelloWorldServices и HelloWorldPresentation), и мы используем Jenkins для сборки.

Ошибка после успешного выполнения теста:

[INFO] --- jacoco-maven-plugin:0.7.6.201602180812:report (default-cli) @ HelloWorldServices ---
[INFO] Skipping JaCoCo execution due to missing execution data file:/var/lib/jenkins/workspace/HelloWorld/HelloWorldServices/target/jacoco.exec

Строки перед ним говорят

[INFO] --- jacoco-maven-plugin:0.7.6.201602180812:prepare-agent (default-cli) @ HelloWorldServices ---
[INFO] argLine set to -javaagent:/var/lib/jenkins/.m2/repository/org/jacoco/org.jacoco.agent/0.7.6.201602180812/org.jacoco.agent-0.7.6.201602180812-runtime.jar=destfile=/var/lib/jenkins/workspace/HelloWorld/HelloWorldServices/target/jacoco.exec

Вот как я определил родительский плагин pom JaCoCo:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.6.201602180812</version>
    <configuration>
        <destfile>${project.artifactId}/target/jacoco.exec</destfile>
        <datafile>${project.artifactId}/target/jacoco.exec</datafile>
    </configuration>

    <executions>
        <execution>
            <id>jacoco-initialize</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>jacoco-site</id>
            <phase>package</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Я ни в коем случае не упомянул о верности. Я также пробовал то, что вы найдете повсюду, чтобы добавить argLine в конфигурацию, но все с тем же результатом. Файл JaCoCo .exec никогда не создавался, чем бы я ни занимался. Что касается целей, я использую

mvn clean install jacoco:prepare-agent jacoco:report

Поскольку, когда я опускаю цели jacoco, он даже не отображает сообщение INFO.


person dasLort    schedule 30.03.2016    source источник
comment
попробуйте вместо этого mvn clean jacoco:prepare-agent install (агент между двумя фазами)   -  person A_Di-Matteo    schedule 30.03.2016
comment
Я столкнулся с той же проблемой несколько дней назад, в моем случае проблема заключалась в том, что я не следовал соглашению об именах. Тестовый файл должен называться * Test.java. Как только я выполнил соглашение об именах, проблема исчезла.   -  person Sajjad Salehi    schedule 22.01.2020
comment
Очень хороший ответ, решивший для меня проблему.   -  person Dhaval D    schedule 20.05.2021


Ответы (3)


Вы должны вызывать агент не после фазы установки, а до, поэтому вместо вызова:

mvn clean install jacoco:prepare-agent jacoco:report

Вы должны вызвать

mvn clean jacoco:prepare-agent install jacoco:report

Основная причина: агент не будет участвовать в жизненном цикле сборки, фаза test уже будет выполняться как часть фазы install, затем Maven выполнит агент в соответствии с вызовом командной строки, но будет слишком поздно.


Вероятно, вам также следует изменить конфигурацию плагина, указанную выше, на:

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

Примечание: я удалил раздел конфигурации, потому что он фактически указывал на значения по умолчанию. Более того, здесь элементы XML чувствительны к регистру, поэтому ваш элемент datafile был просто проигнорирован, вместо него должен был быть dataFile. То же самое и с destFile.

Цель prepare-agent уже использует ${project.build.directory}/jacoco.exec в качестве значения по умолчанию destFile, то же самое применимо к dataFile значение для цели report. Основной причиной этого изменения была бы более гибкая и стандартная сборка, не использующая artifactId в качестве имени проекта (по умолчанию, но все же не обязательная) и использующая более общее свойство ${project.build.directory} вместо того, чтобы указывать непосредственно на target.


Последнее замечание: убедитесь, что выполнение плагина Jacoco настроено в разделе build/plugins, а не в разделе build/pluginManagement/plugins. Раздел pluginManagement предназначен для управления и общего согласования версий или конфигураций, но он будет проигнорирован, если соответствующий плагин не будет объявлен в build/plugins.
Согласно официальный справочник по Maven POM

pluginManagement: это элемент, который отображается рядом с дополнительными модулями. Управление подключаемыми модулями содержит элементы подключаемых модулей почти таким же образом, за исключением того, что вместо настройки информации о подключаемых модулях для этой конкретной сборки проекта оно предназначено для настройки сборок проекта, которые наследуются от этой сборки. Однако при этом настраиваются только те плагины, которые фактически упоминаются в элементе plugins в дочерних элементах. Дети имеют полное право отменять pluginManagement определения.

(примечание: мой жирный шрифт)

person A_Di-Matteo    schedule 30.03.2016
comment
что мне нужно сделать, чтобы эта работа работала только при вызове mvn install? Если я явно не назову цели хакоко, они не будут выполнены. - person dasLort; 30.03.2016
comment
@dasLort какую версию Maven вы используете? Мне не удалось воспроизвести вашу проблему с образцом многомодульного проекта, я не получал предупреждения о пропуске и правильно получил отчеты jacoco - person A_Di-Matteo; 30.03.2016
comment
Maven 3.3.9 и (Jenkins) плагин интеграции Maven 2.12.1. Итак, вы говорите, что можете mvn install, и с приведенной выше конфигурацией он вызовет jacoco? - person dasLort; 30.03.2016
comment
Я обнаружил, что редактирование файла META-INF / plexus / default-bindings.xml может помочь. К сожалению, я думаю, что при использовании плагина Jenkins Maven этот будет внутри банки. Более того, я не нашел указанную банку (не в maven-core-3.0.jar) - person dasLort; 30.03.2016
comment
@dasLort действительно, вы не должны его менять, какие изменения заставили его работать? - person A_Di-Matteo; 30.03.2016
comment
Это все еще не работает. Я предполагаю, что вы ДОЛЖНЫ отредактировать этот файл, но невозможность настроить его через Jenkins делает крайне маловероятным, что это правильный путь (поскольку банка может быть перезаписана в любое время). Могло бы быть нормально, если бы этот файл был постоянным (т.е. без плагина Jenkins), но в моем случае это просто плагин. btw источник: maven.apache.org/ref/3.3 .9 / maven-core / default-bindings.html. - person dasLort; 30.03.2016
comment
@dasLort нет, вы не должны изменять этот файл, это привязки по умолчанию, но вы всегда можете изменить их через файл POM - person A_Di-Matteo; 30.03.2016
comment
Позвольте нам продолжить это обсуждение в чате. - person dasLort; 31.03.2016
comment
Этот ответ так точен! Я часами просматривал другие ответы, которые почему-то не содержали такой информации. Моя проблема теперь решена, спасибо вам большое! - person payne; 16.12.2019

  • Отчеты JaCoCo создаются из файла данных выполнения.
  • Если этого файла нет, то цель отчета JaCoCo пропускает создание отчета.
  • Таким образом, создание файла данных выполнения является обязательным.

Причины, по которым файл данных выполнения не создается, следующие:
- Тесты отсутствуют.
- Все тесты игнорируются.
- Плагин Surefire отсутствует.
- Цель агента подготовки JaCoCo не выполняется, в результате чего argLine, необходимый для настройки, устанавливается в режим уверенного действия.
- Плагин Surefire не настроен с агентом JaCoCo.

person Shivkumar Kawtikwar    schedule 18.04.2019

Я думаю, что "destfile" и "datafile" чувствительны к регистру, поэтому попробуйте заменить их на "destFile" и "dataFile", может быть, это сработает :)

person Bogdan Halmaghi    schedule 28.09.2016