Цель слияния jacoco не может найти файлы данных для дочерних модулей
У меня большая многопроектная сборка Maven с модульными тестами на основе PowerMock. Я генерирую "target/jacoco.exec" в дочерних модулях с настройкой плагина в общем родительском pom для дочерних модулей. У меня есть дополнительный дочерний модуль, который просто использует "report-aggregate" и который определяет различные дочерние модули как зависимости. Это все в основном работает.
Я сейчас пытаюсь интегрировать эти данные с SonarQube. Похоже, что версия установленного Java Analyzer SonarQube не знает, как обрабатывать несколько файлов jacoco.exec, она будет обрабатывать только один. Итак, я пытаюсь добиться цели "слияния" для работы. Я читаю документы по этой цели, но, очевидно, что-то делаю неправильно, потому что просто не могу найти файлы данных.
В том же дочернем модуле, который я использую "report-aggregate", я сделал следующее:
<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
Как вы можете видеть, он выполнил задачу "слияния", но не нашел файлов данных, хотя более поздняя цель "объединить отчеты" сделала.
Поэтому я предполагаю, что способ указания наборов файлов или что-то связанное с ним как-то не так. Что здесь может быть не так?
2 ответа
Попробуйте переместить <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>
У меня было две проблемы с тем, как я определял цель "слияния":
Фаза по умолчанию для "слияния" - "генерировать ресурсы". Я не могу представить, как это могло бы быть полезным, так как я не понимаю, как эти файлы данных могли быть созданы до этого этапа. Я изменил его, чтобы "проверить", и это работало лучше.
В наборе файлов я указывал пути к каталогам относительно этого дочернего модуля, когда мне следовало указывать их относительно корня проекта. Я удалил "../" из этих путей, и это решило эту проблему.
Моя конфигурация немного отличается, так как у меня есть дочерний модуль отчетов, который должен обрабатывать все другие модули, не дочерние и не братья или сестры, а двоюродные братья. Я получил конфигурацию lile:
<fileSets>
<fileSet>
<directory>${project.build.directory}/../../../</directory>
<includes>
<include>**/*.exec</include>
</includes>
</fileSet>
</fileSets>
Выполнение следующих действий может помочь в исследовании проблем конфигурации:
mvn org.jacoco:jacoco-maven-plugin:merge -X
Но, как предлагается в другом ответе, для этого требуется переместить конфигурацию из исполнительного блока в основную конфигурацию плагина.