web-dev-qa-db-fra.com

JaCoCo ne génère pas jacoco.exec avant d'avoir ignoré l'exécution de JaCoCo

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:

  • plugin jacoco-maven
  • plugin vertx-maven
  • maven-resources-plugin
  • plug-in de dépendance maven
  • plugin maven-surefire
  • plugin maven-fail-safe
  • maven-surefire-report-plugin
  • maven-Assembly-plugin

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?

11
pushit real

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>
5
Massimo

Pour résoudre ce problème, j'utiliserais les trois étapes suivantes:

  1. 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.

  2. Déterminez la phase d'exécution du plug-in. Par exemple. pour maven-failsafe-plugin ce serait probablement integration-test.

  3. 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.

3
Andreas Veithen

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

PRÊT

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>
1
Armando Cordova

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>
1
Karan Sharma