2012-09-04 4 views
16

J'ai configuré le plugin JaCoCo Maven comme suit dans mon fichier pom.xml:Maven erreur plugin JaCoCo

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <jacoco.version>0.5.9.201207300726</jacoco.version> 
</properties> 

<profiles> 
    <profile> 
     <id>jacoco4</id> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.jacoco</groupId> 
        <artifactId>jacoco-maven-plugin</artifactId> 
        <version>${jacoco.version}</version> 
        <executions> 
         <execution> 
          <goals> 
           <goal>prepare-agent</goal> 
          </goals> 
          <configuration 
          <destfile>${project.build.directory}/target/jacoco.exec</destfile> 
          <datafile>${project.build.directory}/target/jacoco.exec</datafile> 
           <output>file</output> 
           <append>true</append> 
          </configuration> 
         </execution> 
         <execution> 
          <id>report</id> 
          <phase>prepare-package</phase> 
          <goals> 
           <goal>report</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 

J'utilise Windows 7 et le plug-in apache-maven-3.0.4. Quand je tape mvn -P jacoco4 install, soit à partir d'un terminal Cygwin ou d'un terminal invite de commandes, téléchargements Maven et exécute le plugin JaCoCo, mais le fichier jacoco.exec ne semble pas avoir été créé. Ci-dessous le message d'erreur:

[ERROR] Unable to read execution data file C:\Users\brownru\workspace64new\vps9\vps-fileserver\target\jacoco.exec: C:\Users\brownru\workspace64new\vps9\vps-fileserver\target\jacoco.exec (The system cannot find the file specified) 
java.io.FileNotFoundException: C:\Users\brownru\workspace64new\vps9\vps-fileserver\target\jacoco.exec (The system cannot find the file specified) 
     at java.io.FileInputStream.open(Native Method) 
     at java.io.FileInputStream.<init>(FileInputStream.java:120) 
     at org.jacoco.maven.ReportMojo.loadExecutionData(ReportMojo.java:251) 
     at org.jacoco.maven.ReportMojo.executeReport(ReportMojo.java:228) 
     at org.jacoco.maven.ReportMojo.execute(ReportMojo.java:217) 
     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 
     at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 
     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) 
     at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) 
     at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) 
     at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) 
     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320) 
     at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) 
     at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537) 
     at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) 
     at org.apache.maven.cli.MavenCli.main(MavenCli.java:141) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) 

Ce message d'erreur apparaît si oui ou non j'inclure les destfile et datafile spécificateurs dans la configuration du plug-in:

<destfile>${project.build.directory}/target/jacoco.exec</destfile> 
<datafile>${project.build.directory}/target/jacoco.exec</datafile> 

Quelqu'un peut-il s'il vous plaît me dire ce que je suis mal faire?

Répondre

0

J'utilise la configuration:

<plugin> 
     <groupId>org.jacoco</groupId> 
     <artifactId>jacoco-maven-plugin</artifactId> 
     <version>${jacoco.version}</version> 
      <configuration> 
        <skip>${skipTests}</skip> 
      </configuration> 
      <executions> 
        <execution> 
           <id>jacoco-initialize</id> 
           <phase>initialize</phase> 
           <goals> 
            <goal>prepare-agent</goal> 
           </goals> 
          </execution> 
          <execution> 
           <id>jacoco-site</id> 
           <phase>package</phase> 
           <goals> 
            <goal>report</goal> 
           </goals> 
          </execution> 
      </executions> 
     </plugin> 

Mise à jour: Configuration générée par sonar (sonar pom.xml):

<plugin> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.12</version> 
     <executions> 
      <execution> 
      <id>default-test</id> 
      <phase>test</phase> 
      <goals> 
       <goal>test</goal> 
      </goals> 
      <configuration> 
       <excludedGroups>server,ignore,integration</excludedGroups> 
      </configuration> 
      </execution> 
     </executions> 
     <configuration> 
      <excludedGroups>server,ignore,integration</excludedGroups> 
      <argLine>-javaagent:/tmp/jacocoagent3671192291664069011.jar=destfile=target/jacoco.exec,excludes=*_javassist_*</argLine> 
      <testFailureIgnore>true</testFailureIgnore> 
     </configuration> 
     </plugin> 

Un problème - comment définir "jacocoagent3671192291664069011.jar" pour chaque build. Il devrait être dans:

$M2_HOME/repository/org/jacoco/org.jacoco.agent/${jacoco.version}/org.jacoco.agent-${jacoco.version}-runtime.jar 
+0

@kirigiri Avez-vous essayé ma configuration? –

+0

Merci pour votre réponse, que je n'ai pas vu jusqu'à aujourd'hui. J'ai essayé votre configuration, à l'exception de la $ {skipTests}, mais votre configuration ne résout pas le problème. As-tu d'autres idées? – kirigiri

+0

Vous avez raison. Je viens de copier de mon projet (parent pom). Les tests sont ignorés pour certains modules. J'utilise jenkins avec sonar (et jacoco). Là, vous n'avez pas besoin de lancer jacoco manuellement. –

21

J'ai eu le même problème avec jacoco et maven. Il était lié à une pom-mère de remplacement de la configuration surefire. Dans ce cas, ce plug-in n'a pas utilisé l'argument (pour argument jvm) définissant l'agent.

La solution a été de mettre l'élément de configuration "argLine" Retour

<plugin> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <configuration> 
    <argLine>${argLine}</argLine> 
    </configuration> 
</plugin> 

plug-in pleine conf ressemble

<plugin> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <configuration> 
    <skip>true</skip> 
    </configuration> 
    <executions> 
    <execution> 
     <id>unit-test</id> 
     <phase>test</phase> 
     <goals> 
     <goal>test</goal> 
     </goals> 
     <configuration> 
     <skip>${maven.test.skip}</skip> 
     <argLine>${argLine}</argLine> 
     <excludes> 
      <exclude>**/*IntegrationTest.java</exclude> 
     </excludes> 
     </configuration> 
    </execution> 
    <execution> 
     <id>integration-test</id> 
     <phase>integration-test</phase> 
     <goals> 
     <goal>test</goal> 
     </goals> 
     <configuration> 
     <skip>${skipITs}</skip> 
     <argLine>${argLine}</argLine> 
     <includes> 
      <include>**/*IntegrationTest.java</include> 
     </includes> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <version>0.5.10.201208310627</version> 
    <configuration> 
     <skip>${maven.test.skip}</skip> 
     <destFile>${basedir}/target/coverage-reports/jacoco-unit.exec</destFile> 
     <dataFile>${basedir}/target/coverage-reports/jacoco-unit.exec</dataFile> 
     <output>file</output> 
     <append>true</append> 
    </configuration> 
    <executions> 
     <execution> 
      <id>jacoco-initialize</id> 
      <goals> 
       <goal>prepare-agent</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>jacoco-site</id> 
      <phase>verify</phase> 
      <goals> 
       <goal>report</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

espère qu'il sera utile

+3

en ajoutant le $ {argLine} a travaillé pour moi. Assurez-vous simplement de l'ajouter au plugin de construction et non au plugin de rapport (comme ce que j'ai essayé en premier). Merci. –

+0

Merci beaucoup Comment l'amener sur le site, actuellement son site séparé –

+0

Merci pour cela. Je suppose que l'on doit faire attention en remplaçant la configuration par défaut d'un plugin maven. – dkateros

7

Je suis venu aussi à travers cette problème: JaCoCo ne produit pas un fichier de sortie « jacoco.exec », ce qui signifie qu'aucune analyse de couverture de code se produit.

Dans mon cas, il était également dû à l'utilisation d'un argLine personnalisé dans le plugin Maven Surefire qui a écrasé le plugin JaCoCo Maven Plugin argLine, ce qui a empêché JaCoCo d'être exécuté.

Pour résoudre ce problème, j'utilisé le paramètre optionnel JaCoCo « propertyName » pour exporter son argLine à une propriété Maven et inclus que dans le Surefire argLine:

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <configuration> 
     <propertyName>jacoco.agent.argLine</propertyName> 
    </configuration> 
    ...    
</plugin> 

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.10</version> 
    <configuration> 
     <argLine>-XX:-UseSplitVerifier ${jacoco.agent.argLine}</argLine> 
    </configuration> 
</plugin> 

Cependant cela a causé un problème lors de tests individuels ont été exécutés dans Netbeans. Parce que le plug-in JaCoCo n'a pas été exécuté dans ce scénario la variable « jacoco.agent.argLine » n'a pas été initialisés et Surefire échoué avant d'exécuter des tests. L'ajout d'une propriété vide "jacoco.agent.argLine" au pom a permis de résoudre le problème lors de l'exécution de tests simples, mais cela a également empêché JaCoCo d'exporter son argument argLine lors de son exécution, ce qui a effectivement désactivé JaCoCo.

La dernière partie de la solution que je l'ai utilisé était d'ajouter un profil qui crée la propriété vide et active uniquement lorsqu'un seul test est spécifié:

<profiles> 
    <profile> 
     <activation>     
      <property> 
       <name>test</name>  
      </property> 
     </activation> 
     <properties> 
      <jacoco.agent.argLine></jacoco.agent.argLine> 
     </properties> 
    </profile> 
</profiles> 
+0

Merci! Ce dernier point sur le profil de test était ce que je cherchais. – nzhenry

13

OK Je pense que je compris ce que qui se passe.

Par défaut, le plugin jacoco « runs » avant la phase de test (généralement il court le but prepare-agent pendant la phase du cycle de vie initialize), et quand il fonctionne, il définit simplement une propriété Maven appelé « argLine » à quelque chose comme -javaagent=jacoco.jar

ex:

[INFO] argLine set to -javaagent:/usernamed/.m2/repository/org/jacoco/org.jacoco.agent/ 0.5.6.2012/org.jacoco.agent-0.5.6.2012-runtime.jar=destfile=/path/to/target/jacoco.exec

Par défaut, maven-surefire-plugin essentiellement "précèder" cette propriété (si elle est réglée sur quoi que ce soit) à ses processus de test java fourchues, donc ils obtiennent les marchandises. Ex: java ${argLine ends up here}> -jar /xxx/surefirebooter3741906822495182152.jar

En général (sans jacoco), si vous voulez aussi ajouter quelque chose d'autre de votre propre à cette argLine (par exemple, -Xmx1G ou similaire), vous venez de définir dans la configuration infaillible, comme

<build> 
    <plugins> 
    <plugin> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <configuration> 
      <argLine>-Xmx1G</argLine> 
      </configuration> 
    </plugin> 

Cependant, si vous utilisez jacoco, vous ne pouvez pas le faire de façon normale, vous le faites en définissant une propriété globale, au lieu this way:

<properties> 
    <argLine>-Xmx1G</argLine> 
    </properties> 

Si vous définissez le <configuration><argLine> puis il substitue fondamentalement la propriété système, donc les arguments jacoco ne sont pas transmis au processus fils. C'est pourquoi vous utilisez la propriété à la place. Si vous spécifiez une propriété argLine alors jacoco ajoutera simplement ses paramètres à ce que vous spécifiez, alors surefire l'utilisera.

Cependant, que se passe-t-il si votre parent pom a déjà définir le <configuration><argLine> du plugin à quelque chose? Ou si vous le définissez vous-même? Il utilisera essentiellement cette valeur à la place de la propriété définie par jacoco (vous avez spécifié un remplacement manuel).

Si vous spécifiez <configuration><argLine> vous-même, vous pouvez remplacer cette propriété argLine par une propriété (voir ci-dessus), puis supprimer le <configuration><argLine> et cela devrait fonctionner. Si vous ne pouvez pas contrôler le parent, et que le parent spécifie quelque chose pour argline, alors vous devrez utiliser la route <configuration><argLine>${argLine} -Xmx1G</argLine>. C'est pour lui ordonner d'ignorer tout ce que le parent a défini cette valeur, et d'utiliser argLine à la place (celui que jacoco définit pour vous). (Je ne sais pas s'il existe un moyen facile d '"ajouter" à la valeur du pom parent pour cette valeur, si quelqu'un sait comment se sentir libre de commenter ici).

Mais que se passe-t-il si jacoco ne fonctionne pas pour une cible ou un profil? Ensuite, jamais la ${argLine} variable devient définie, et vous pouvez exécuter en une erreur comme ceci:

Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.14:test failed: The forked VM terminated without saying properly goodbye. VM crash or System.exit called ? [ERROR] Command was/bin/sh -c cd ...java '${argLine}' ...

Eh bien, il se trouve que jacoco que « ajoute » à la propriété nommée argLine, quand il fonctionne. Vous pouvez donc ajouter en toute sécurité un <properties><argLine></argLine></properties> à votre pom (à moins que vous ne l'ayez déjà dans le pom parent, vous n'avez rien à ajouter). Si jacoco est invoqué, il s'y ajoute. Sinon, il est défini sur une chaîne vide, ce qui est OK. On ne sait pas non plus s'il existe un moyen de "rajouter" à la valeur du parent pour une propriété, donc soit l'hériter, si vous le savez, soit le spécifier comme vide.

Ainsi, à la fin pour moi, depuis mon pom-mère amont (inaccessible) déclarée comme

<configuration><argList>${argList}</argList></configuration>

J'ai été obligé de suivre essentiellement cette route, depuis sa déjà dans un (sur de mon contrôle) pom-mère, ainsi:

<configuration><argList>${argList} -Xmx1G</argList></configuration>

Questions connexes