J'ai du mal à générer des rapports AHP via JaCoCo dans l'un de mes modules. Lorsque la construction démarre, je vois que JaCoCo définit correctement argLine avec:
[INFO] jacoco.agent.argLine set to -javaagent:<...>/.m2/repository/org/jacoco/org.jacoco.agent/0.7.2.201409121644/org.jacoco.agent-0.7.2.201409121644-runtime.jar=destfile=<...>/target/jacoco.exec
Cependant, le .exec n'a pas encore été créé au moment où maven essaie d'exécuter JaCoCo:
[INFO] Skipping JaCoCo execution due to missing execution data file:<...>/target/jacoco.exec
Le jacoco.exec finit par être créé, après que maven ait ignoré l'exécution de JaCoCo. Par conséquent, je peux toujours générer des rapports AHP, si je réexécute la génération sans nettoyage.
J'ai vu dans diverses autres questions que je dois être prudent en utilisant Maven Surefire avec JaCoCo. Cependant, je n'utilise pas explicitement argLine dans mes plugins Surefire, ni dans aucun plugin d'ailleurs. Je commence à me demander si l'un des autres plugins détourne automatiquement le paramètre argLine comme JaCoCo.
Voici une liste de tous les plugins utilisés:
Je vois un message suspect dans la sortie de la build:
[INFO] --- maven-compiler-plugin:3.0:compile (default-compile) @ <module> ---
[INFO] Changes detected - recompiling the module!
Je ne sais pas si c'est pertinent, mais il apparaît deux fois avant le message de saut et n'apparaît pas dans un module où JaCoCo fonctionne correctement.
Des idées?
* edit - Voici la config jacoco
<plugins>
<...>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.version}</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>
</plugins>
<pluginManagement>
<plugins>
<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
<plugin>
<groupId>org.Eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.jacoco</groupId>
<artifactId>
jacoco-maven-plugin
</artifactId>
<versionRange>
[0.7.2.201409121644,)
</versionRange>
<goals>
<goal>prepare-agent</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore></ignore>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
Je ne sais pas exactement ce que fait cette partie de la gestion des plugins, mais le commenter ne résout rien. J'ai également essayé de placer la configuration du plug-in JaCoCo au-dessus de la configuration surefire/FailSafe au cas où l'ordre importait que les plugins partagent les mêmes objectifs, mais cela n'a pas aidé non plus.
* edit 2 - On dirait que le problème était lié aux infaillibles. Les commenter corrige en quelque sorte la génération .exec de JaCoCo, et JaCoCo fonctionne correctement.
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven.surefire.plugin.version}</version>
<configuration>
<!-- <includes>
<include>**/unit/**/*Test*.Java</include>
</includes> -->
</configuration>
</plugin>
Quelqu'un sait pourquoi?
Juste un ajout aux réponses déjà données. Il peut arriver que dans votre configuration maven-surefire-plugin, vous utilisiez déjà la configuration argLine pour remplacer quelque chose comme la mémoire utilisée. Si vous le faites, l'argline définie par jacoco-maven-plugin ne sera pas utilisée à défaut de générer le rapport jacoco. Dans ce cas, attribuez un nom de propriété à la configuration jacoco-maven-plugin, puis référencez-le dans votre paramètre argLine maven-surefire-plugin.
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.9</version>
<executions>
<!-- prepare agent for measuring unit tests -->
<execution>
<id>prepare-unit-tests</id>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<append>true</append>
<destFile>${sonar.jacoco.reportPath}</destFile>
<!-- Sets the VM argument line used when unit tests are run. -->
<propertyName>surefireArgLine</propertyName>
</configuration>
</execution>
</executions>
</plugin>
[...]
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<printSummary>false</printSummary>
<redirectTestOutputToFile>true</redirectTestOutputToFile>
<forkCount>3</forkCount>
<reuseForks>true</reuseForks>
<argLine>${surefireArgLine} -Xmx1024m -noverify</argLine>
</configuration>
</plugin>
Pour résoudre ce problème, j'utiliserais les trois étapes suivantes:
Déterminez quelle exécution de plugin produit le jacoco.exec
fichier. Pour ce faire, vous pouvez exécuter Maven avec la journalisation du débogage activée (mvn -X
) et recherchez le jacoco.agent.argLine
nom de la propriété ou sa valeur dans la sortie. Vous pouvez également consulter le POM efficace (mvn help:effective-pom
) dans le cas où la configuration appropriée provient du POM parent. Notez que je suppose que c'est une exécution de maven-failsafe-plugin
.
Déterminez la phase d'exécution du plug-in. Par exemple. pour maven-failsafe-plugin
ce serait probablement integration-test
.
Modifiez la configuration du plugin JaCoCo pour que l'objectif report
soit exécuté plus tard dans le build lifecycle . Par exemple. si la jacoco.exec
le fichier est produit dans le integration-test
phase, vous pouvez exécuter l'objectif report
dans le post-integration-test
phase.
Je n'ai trouvé aucune solution, mais j'ai fait ce qui suit:
mvn clean jacoco: prepare-agent install créer un fichier jacoco.exec, mais exécuter mvn sonar: sonar not create File.
Solution:
Étape 1: mvn clean jacoco: prepare-agent install
Étape 2: copier le fichier jacoco.exec depuis/src/main/resources Étape 3:
Ajouter le prochain plugin sur pom.xml
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>
${basedir}/target/</outputDirectory>
<resources>
<resource>
<directory>
${basedir}/src/main/resources/ </directory>
<includes>
<include>jacoco.exec</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
<configuration>
<encoding>cp1252</encoding>
</configuration>
</plugin>
Étape 4: mvn clean install
Étape 5:
sonar mvn: sonar
Ajouter ma section Plugins
<pluginManagement>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>cp1252</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>
${basedir}/target/</outputDirectory>
<resources>
<resource>
<directory>
${basedir}/src/main/resources/ </directory>
<includes>
<include>jacoco.exec</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
<execution>
<id>copy-folder</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}</outputDirectory>
<resources>
<resource>
<filtering>false</filtering>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
<configuration>
<encoding>cp1252</encoding>
</configuration>
</plugin>
<!-- Plugin Sonar -->
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.1</version>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.6.201602180812</version>
<configuration>
<destFile>${project.build.directory}/jacoco.exec</destFile>
</configuration>
<executions>
<execution>
<id>jacoco-initialize</id>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<destFile>${basedir}/target/jacoco.exec</destFile>
<dataFile>${basedir}/target/jacoco.exec</dataFile>
</configuration>
</execution>
<execution>
<id>jacoco-site</id>
<phase>package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
pour moi, l'une des raisons pour lesquelles le fichier exec n'est pas généré est lorsque j'ai placé les objectifs prepare-agent, prepare-package dans la section plugin de pluginManagement
lorsque j'ai essayé le même pluginManagement extérieur, j'ai réussi à exécuter le même et le fichier jacoco-exec a été généré à l'aide de la commande mvn clean install
mon pomfile est comme ci-dessous:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>mmt</groupId>
<artifactId>jacoco</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>jacoco</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<argLine>-Xms256m -Xmx1524m -XX:MaxPermSize=256m -Duser.language=en</argLine>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.Apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.7.201606060606</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>
</plugins>
</build>
</project>