2016-10-16 2 views
1

Essayer d'obtenir une couverture via jacoco en utilisant des instruments hors ligne (ne peut pas utiliser l'instrumentation à la volée: en raison de powermock testcases) pour un projet maven. Ajoute le jacocoagent.jar au classpath dans le plugin surefire comme indiqué ci-dessous. Renommé le "org.jacoco.agent-0.7.7.201606060606-runtime.jar" (du référentiel maven local) à "jacocoagent.jar" et gardé cela dans le même dossier où ce pom.xml réside.Je frappe le dessous exception même après l'avoir ajouté à classpath.Jacoco - "Provoqué par: java.lang.ClassNotFoundException: org.jacoco.agent.rt.internal_6da5971.Offline"

extrait de pom.xml (surefire - configuration plug-in)

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <configuration> 
        <forkmode>once</forkmode> 
        <additionalClasspathElements> 
      <additionalClasspathElement>jacocoagent.jar</additionalClasspathElement> 
             </additionalClasspathElements> 
       </configuration> 
    </plugin> 

Exception vu sur la console:

############# 
Number of foreign imports: 1 
import: Entry[import from realm ClassRealm[maven.api, parent: null]] 

----------------------------------------------------- 

     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:166) 
     ... 21 more 
Caused by: java.lang.NoClassDefFoundError: org/jacoco/agent/rt/internal_6da5971/Offline 
     at com.cisco.ise.ups.modelframework.hibernate.OracleNamingStrategy.$jacocoInit(OracleNamingStrategy.java) 
     at com.cisco.ise.ups.modelframework.hibernate.OracleNamingStrategy.<clinit>(OracleNamingStrategy.java) 
     at sun.misc.Unsafe.ensureClassInitialized(Native Method) 
     at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:43) 
     at sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:142) 
     at java.lang.reflect.Field.acquireFieldAccessor(Field.java:1082) 
     at java.lang.reflect.Field.getFieldAccessor(Field.java:1063) 
     at java.lang.reflect.Field.get(Field.java:387) 
     at com.cisco.ise.ups.build.WorkflowRunnerMojo.namingStrategyInstance(WorkflowRunnerMojo.java:335) 
     at com.cisco.ise.ups.build.WorkflowRunnerMojo.setupWorkflowEnvironment(WorkflowRunnerMojo.java:514) 
     at com.cisco.ise.ups.build.WorkflowRunnerMojo.execute(WorkflowRunnerMojo.java:816) 
     at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134) 
     ... 21 more 
Caused by: java.lang.ClassNotFoundException: org.jacoco.agent.rt.internal_6da5971.Offline 
     at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50) 
     at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:271) 
     at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:247) 
     at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:239) 
     ... 33 more 
[ERROR] 
############### 

étapes suivies:

  1. "compilation mvn".
  2. "mvn org.jacoco: jacoco-maven-plugin: instrument"
  3. "test mvn" - Exception déclenchée à cette étape.

Comment est-ce que je me libère de cette exception? Était-ce le bon endroit pour ajouter un classpath ?? (dans le plugin surefire) OU devrait-il être spécifié où?

Merci.

+0

Je serais prêt à parier que, s'il est nécessaire d'ajouter des bibliothèques pour les tests, ils doivent être spécifiés dans la section '' de la pom, avec scope = test. –

+0

@LittleSanti: Tweaked pom.xml selon la suggestion. Le problème (exception) persiste. Ajouté ces lignes sous l'onglet . org.jacoco org.jacoco.Agent Test exécution 0.7.7.201606060606 . ** Déjà jacocoagent.jar a été téléchargé et présent sur le disque. Il est juste nécessaire de le rendre disponible sur classpath afin que les classes instrumentées puissent l'initier ** (http://www.eclemma.org/jacoco/trunk/doc/offline.html). Pas sûr, ce qui manque encore !!! – gthy

+0

Je vois. Eh bien ... L'autre solution que je pense est de définir cette dépendance dans les dépendances ** du plugin **, car le classloader des plugins peut être différent du classloader du code testé. –

Répondre

0

dr. macphail's trance article sur l'obtention Sonar + JaCoCo + PowerMock a fait le travail pour moi:

<!-- Provide information for coverage per test --> 
    <profile> 
    <id>coverage-per-test</id> 
    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <version>2.20</version> 
       <configuration> 
       <argLine>${argLine} -Xverify:none</argLine> 
       <properties> 
        <property> 
         <name>listener</name> 
         <value>org.sonar.java.jacoco.JUnitListener</value> 
        </property> 
       </properties> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencies> 
     <dependency> 
      <groupId>org.sonarsource.java</groupId> 
      <artifactId>sonar-jacoco-listeners</artifactId> 
      <version>4.9.0.9858</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 
    </profile> 

Comme mentionné dans la section des commentaires du blog:

Dans le cas où votre argLine par défaut n'est pas « simple » vous pourriez avoir besoin d'utiliser l'extrait suivant:

{} argLine -XX: -UseSplitVerifier

Sinon, vous risquez de rencontrer ClassNotFoundException, par exemple. java.lang.ClassNotFoundException: org.jacoco.agent.rt.RT

0

Les choses classpath sur le plug-in est surefire pas nécessaire. Vous devez ajouter une dépendance à chaque module qui a des tests, comme ceci:

<dependency> 
    <groupId>org.jacoco</groupId> 
    <artifactId>org.jacoco.agent</artifactId> 
    <classifier>runtime</classifier> 
    <scope>test</scope> 
    <version>${your.jacoco.version}</version> 
</dependency> 

Assurez-vous que vous ne manquez pas la partie « classificateur », ou il ne fonctionnera pas.

Full example from PowerMock project