Цель слияния jacoco не может найти файлы данных для дочерних модулей

У меня есть большая многопроектная сборка Maven с модульными тестами на основе PowerMock. Я создаю «target/jacoco.exec» в дочерних модулях с конфигурацией плагина в общем родительском pom для дочерних модулей. У меня есть дополнительный дочерний модуль, который просто использует «отчет-агрегат» и указывает различные дочерние модули в качестве зависимостей. Это все в принципе работает.

Сейчас я пытаюсь интегрировать эти данные с SonarQube. Похоже, что установленная версия SonarQube Java Analyzer не знает, как обрабатывать несколько файлов jacoco.exec, она будет обрабатывать только один. Итак, я пытаюсь заставить цель "слияния" работать. Я читал документы по этой цели, но я явно что-то не так делаю, так как просто не находит файлы данных.

В том же дочернем модуле, в котором я использую «отчет-агрегат», я сделал следующее:

         <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.7.8</version>
            <executions>
                <execution>
                    <id>report-aggregate</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>report-aggregate</goal>
                    </goals>
                </execution>
                <execution>
                   <id>merge</id>
                   <goals>
                       <goal>merge</goal>
                   </goals>
                   <configuration>
                       <fileSets>
                           <fileSet>
                               <directory>../childmodule1/target</directory>
                               <include>*.exec</include>
                           </fileSet>
                           <fileSet>
                               <directory>../childmodule2/target</directory>
                               <include>*.exec</include>
                           </fileSet>
                           ... several more
                       </fileSets>
                   </configuration>
                </execution>
            </executions>
        </plugin>

Когда я запустил «mvn clean install» с верхнего уровня, он в конечном итоге обработал дочерний модуль «jacoco-aggregate» и выдал следующий вывод:

[INFO] ------------------------------------------------------------------------
[INFO] Building jacoco-aggregate 2.3.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ jacoco-aggregate ---
[INFO] Deleting ...\jacoco-aggregate\target
[INFO] 
[INFO] --- jacoco-maven-plugin:0.7.8:merge (merge) @ jacoco-aggregate ---
[INFO] Skipping JaCoCo merge execution due to missing execution data files
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (filter) @ jacoco-aggregate ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory ...\jacoco-aggregate\src\main\resources
[INFO] 
[INFO] --- depends-maven-plugin:1.2:generate-depends-file (generate-depends-file) @ jacoco-aggregate ---
[INFO] Created: ...\jacoco-aggregate\target\classes\META-INF\maven\dependencies.properties
[INFO] 
[INFO] --- jacoco-maven-plugin:0.7.8:instrument (default-instrument) @ jacoco-aggregate ---
[INFO] 
[INFO] --- jacoco-maven-plugin:0.7.8:restore-instrumented-classes (default-restore-instrumented-classes) @ jacoco-aggregate ---
[INFO] 
[INFO] --- jacoco-maven-plugin:0.7.8:report (default-report) @ jacoco-aggregate ---
[INFO] Skipping JaCoCo execution due to missing execution data file.
[INFO] 
[INFO] --- maven-javadoc-plugin:2.10.4:jar (module-javadoc-jar) @ jacoco-aggregate ---
[INFO] Not executing Javadoc as the project is not a Java classpath-capable package
[INFO] 
[INFO] --- jacoco-maven-plugin:0.7.8:report-aggregate (report-aggregate) @ jacoco-aggregate ---
[INFO] Loading execution data file ...\childmodule1\target\jacoco.exec
[INFO] Loading execution data file ...\childmodule2\target\jacoco.exec
... several more
[INFO] Analyzed bundle 'childmodule1' with 1 classes
[INFO] Analyzed bundle 'childmodule2' with 1 classes

Как вы можете видеть, он выполнил цель «слияния», но не нашел никаких файлов данных, хотя более поздняя цель «отчет-агрегация» нашла.

Поэтому я предполагаю, что то, как я указываю наборы файлов или что-то связанное с этим, как-то неправильно. Что здесь может быть не так?


person David M. Karr    schedule 01.02.2017    source источник
comment
У вас есть все модули, перечисленные в вашем родительском pom? в разделе ‹модули›‹/модули›   -  person Shek    schedule 01.02.2017
comment
попробуйте добавить ‹goal›prepare-agent‹/goal› перед сообщением о цели.   -  person Shek    schedule 01.02.2017
comment
У меня нет модулей, перечисленных в родительском pom, так как это просто родительский pom, а не агрегатор pom. У меня есть отдельный агрегатор pom, в котором перечислены только модули, которые необходимо построить. У меня есть отдельный дочерний модуль с именем jacoco-aggregate, который не перечисляет модули, но перечисляет GAV для дочерних модулей, создающих файлы jacoco.exec, которые необходимо интегрировать.   -  person David M. Karr    schedule 01.02.2017
comment
Использование prepare-agent вообще было бы бесполезным, так как я использую автономные инструменты, поскольку тесты на основе powermock не могут работать с онлайн-инструментами. Кроме того, я сказал выше, что в цели report-aggregate нет ничего плохого, просто цель слияния ничего не делает.   -  person David M. Karr    schedule 01.02.2017
comment
что, если вы вообще удалите записи fileSet и оставите играть значения по умолчанию? стоит попробовать имхо   -  person A_Di-Matteo    schedule 02.02.2017
comment
Ах, я думаю, что я, возможно, решил это. На странице документа указано, что этап жизненного цикла по умолчанию для этой цели — генерация ресурсов. Мне это кажется странным. Какой смысл объединять эти файлы в тот момент, когда они, вероятно, еще не могут существовать? Я просто добавил параметр фазы для проверки, и оказалось, что он нашел все указанные файлы jacoco.exec, а результирующее покрытие, импортированное в SonarQube, похоже, отражает покрытие в нескольких модулях.   -  person David M. Karr    schedule 02.02.2017
comment
Другая деталь, которую я упустил, заключалась в том, что ссылки на каталоги здесь неверны. Я предположил, что они относятся к дочернему модулю, выполняющему эту работу, но, похоже, они относятся к основе проекта.   -  person David M. Karr    schedule 06.02.2017


Ответы (3)


Попробуйте переместить <fileSets> (а также <destFile/>, если есть) в <plugin><configuration>, а не в <execution><configuration>:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.8</version>
    <configuration>
        <fileSets>
            <fileSet>
                <directory>..</directory>
                <include>**/target/*.exec</include>
            </fileSet>
        </fileSets>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>merge</goal>
            </goals>
        </execution>
    </executions>
</plugin>
person krevelen    schedule 22.03.2018

У меня было две проблемы с тем, как я указывал цель «слияния»:

  • Фаза по умолчанию для «слияния» — «генерация ресурсов». Я не могу представить, как это может быть когда-либо полезно, поскольку я не понимаю, как эти файлы данных могли быть созданы до этого этапа. Я изменил его на «проверить», и это сработало лучше.

  • В наборе файлов я указывал пути к каталогам относительно этого дочернего модуля, хотя должен был указывать их относительно корня проекта. Я удалил «../» из этих путей, и это решило эту проблему.

person David M. Karr    schedule 14.02.2017

Моя конфигурация немного отличается, так как у меня есть отчетный дочерний модуль, который должен обрабатывать все остальные модули, ни дочерние, ни одноуровневые, а двоюродные. В итоге я получил файл конфигурации:

                <fileSets>
                    <fileSet>
                        <directory>${project.build.directory}/../../../</directory>
                        <includes>
                            <include>**/*.exec</include>
                        </includes>
                    </fileSet>
                </fileSets>

Выполнение следующего может помочь в расследовании проблем с конфигурацией:

mvn org.jacoco:jacoco-maven-plugin:merge -X

Но, как предлагается в другом ответе, для этого требуется перенести конфигурацию из исполнительного блока в основную конфигурацию плагина.

person blacelle    schedule 03.10.2020