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

Вот как я определил родительский плагин 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.

Ответ 1

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

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: это элемент, который отображается вдоль боковых плагинов. Плагин управления содержит элементы плагина почти таким же образом, за исключением того, что вместо того, чтобы настраивать информацию плагина для этой конкретной сборки проекта, он предназначен для настройки сборных проектов, которые наследуются от этого. Однако это только настраивает плагины, которые на самом деле ссылаются на элемент плагинов у детей. Дети имеют полное право переопределять определения pluginManagement.

(примечание: полужирный - мой)

Ответ 2

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

Ответ 3

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

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