web-dev-qa-db-fra.com

JaCoCo avec Maven - fichier de données d'exécution manquant

Nous avons un projet multi-module Maven composé d'un parent (HelloWorld) et de différents enfants (HelloWorldServices et HelloWorldPresentation) et utilisons Jenkins pour construire.

L'erreur après l'exécution du test réussi est

[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

Les lignes avant qu'il ne dise

[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

Voici comment j'ai défini le plugin parent pom 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>

En aucun cas, je n'ai mentionné explicitement infaillible. J'ai aussi essayé ce que l'on trouve partout pour mettre l'argLine dans la configuration mais avec le même résultat. Le fichier JaCoCo .exec n'a jamais été créé, quoi que je fasse. Quant aux objectifs, j'utilise

mvn clean install jacoco:prepare-agent jacoco:report

Depuis que j'omets les objectifs jacoco, il n'affiche même pas le message INFO.

18
dasLort

Vous ne devez pas appeler l'agent après la phase d'installation mais avant, donc au lieu d'invoquer:

mvn clean install jacoco:prepare-agent jacoco:report

Vous devez invoquer

mvn clean jacoco:prepare-agent install jacoco:report

La raison principale est: l'agent ne participera pas au cycle de vie de la construction, la phase test sera déjà exécutée dans le cadre de la phase install, puis Maven exécutera l'agent selon l'invocation de la ligne de commande , mais il sera trop tard.


Vous devriez probablement également changer la configuration du plug-in ci-dessus pour:

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

Remarque: J'ai supprimé la section de configuration, car elle pointait en fait vers des valeurs par défaut. De plus, les éléments XML sont sensibles à la casse ici, donc votre élément datafile a été simplement ignoré, il aurait dû être dataFile à la place. La même chose s'applique à destFile.

Le prepare-agent objectif utilise déjà ${project.build.directory}/jacoco.exec comme valeur par défaut destFile, la même chose s'applique à la valeur dataFile pour l'objectif report . La principale raison de ce changement serait une version plus flexible et standard, ne s'appuyant pas sur artifactId comme nom de projet (par défaut, mais toujours pas obligatoire) et utilisant la version plus générique ${project.build.directory} au lieu de cela pointer directement vers target.


Remarque finale: assurez-vous de configurer les exécutions du plug-in Jacoco dans le build/plugins section et non build/pluginManagement/plugins section. La section pluginManagement est destinée à la gouvernance et à l'harmonisation commune des versions ou configurations, mais elle sera ignorée si le plugin correspondant ne serait pas déclaré sous build/plugins.
Selon référence officielle Maven POM

pluginManagement : est un élément visible le long des plugins latéraux. Plugin Management contient des éléments de plug-in de la même manière, sauf que plutôt que de configurer les informations de plug-in pour cette version de projet particulière, il est destiné à configurer des versions de projet héritant de celle-ci. Cependant, cela ne configure que les plugins qui sont réellement référencés dans l'élément plugins chez les enfants. Les enfants ont le droit de remplacer les définitions de pluginManagement.

(note: gras est le mien)

30
A_Di-Matteo

Je pense que "destfile" et "datafile" sont sensibles à la casse alors essayez de les remplacer par "destFile" et "dataFile", peut-être que ça marchera :)

3
Bogdan Halmaghi
  • Les rapports JaCoCo sont créés à partir du fichier de données d'exécution.
  • Si ce fichier n'est pas présent, l'objectif du rapport JaCoCo ignore la création du rapport.
  • Il est donc obligatoire de créer un fichier de données d'exécution.

Les raisons pour lesquelles le fichier de données d'exécution ne sera pas créé sont les suivantes.
- Les tests ne sont pas présents.
- Tous les tests sont ignorés.
- Le plugin Surefire est manquant.
- L'objectif de préparation d'agent de JaCoCo n'est pas exécuté, ce qui définit argLine qui doit être configuré pour s'éteindre.
- Le plugin Surefire n'est pas configuré avec l'agent de JaCoCo.

1