2015-10-23 43 views
7

Non riesco a generare rapporti AHP tramite JaCoCo in uno dei miei moduli. Quando la costruzione inizia, vedo JaCoCo impostando correttamente argLine con:JaCoCo non genera jacoco.exec fino a dopo aver ignorato l'esecuzione di JaCoCo

[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 

Tuttavia, la .exec non è stato ancora creato per il momento in Maven cerca di correre JaCoCo:

[INFO] Skipping JaCoCo execution due to missing execution data file:<...>/target/jacoco.exec 

Il jacoco. exec viene finalmente creato, dopo che Maven ha saltato l'esecuzione di JaCoCo. Pertanto, posso ancora generare rapporti AHP, se rieseguo la compilazione senza eseguire la pulizia.

Ho visto in varie altre domande che devo fare attenzione a usare Maven Surefire con JaCoCo. Tuttavia, non uso esplicitamente argLine nei miei plugin Surefire o in qualsiasi altro plugin. Sto iniziando a chiedermi se uno degli altri plug-in sta violando il parametro argLine automaticamente come fa JaCoCo.

Ecco un elenco di tutti i plugin utilizzati:

  • jacoco-maven-plugin
  • VertX-maven-plugin
  • Maven-risorse-plugin
  • Maven-dipendenza-plugin
  • maven-surefire-plugin
  • maven-failsafe-plugin
  • maven-surefire-report -plugin
  • Maven-assemblaggio-plugin

faccio vedere uno messaggio sospetto nell'output di generazione:

[INFO] --- maven-compiler-plugin:3.0:compile (default-compile) @ <module> --- 
[INFO] Changes detected - recompiling the module! 

non sono sicuro se questo è rilevante, ma sembra due volte prima del Salto messaggio, e non appare in un modulo in cui JaCoCo funziona correttamente.

Qualche idea?

* modifica - Ecco la jacoco config

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

non sono sicuro esattamente quello che parte di gestione plug-in sta facendo, ma commentando fuori non risolvere nulla. Ho anche provato a mettere la configurazione del plugin JaCoCo sopra la configurazione surefire/failsafe nel caso in cui l'ordine fosse importante per i plug-in che condividevano gli stessi obiettivi, ma questo non è stato d'aiuto.

* modifica 2 - Sembra che il problema includesse surefire. Commentando in qualche modo la versione di Exec di JaCoCo, JaCoCo funziona correttamente.

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

Qualcuno sa perché?

+0

penso u sono problemi nel ciclo di vita, spettacolo pom configurazione jacoco-plugin –

+0

@question_maven_com Aggiunto –

risposta

2

Per risolvere questo problema vorrei utilizzare le seguenti tre fasi:

  1. Determinare i quali l'esecuzione plugin è produrre il file jacoco.exec.Per fare ciò, è possibile eseguire Maven con registrazione debug abilitata (mvn -X) e cercare il nome della proprietà jacoco.agent.argLine o il suo valore nell'output. Si potrebbe anche dare un'occhiata al POM efficace (mvn help:effective-pom) nel caso in cui la configurazione rilevante provenga dal padre POM. Si noti che la mia ipotesi è che si tratta di un'esecuzione dello maven-failsafe-plugin.

  2. Determina la fase in cui viene eseguito il plug-in. Es. per maven-failsafe-plugin questo sarebbe probabilmente integration-test.

  3. Modificare la configurazione del plug-in JaCoCo in modo che l'obiettivo report venga eseguito successivamente nello build lifecycle. Per esempio. se il file jacoco.exec viene prodotto nella fase integration-test, è possibile eseguire l'obiettivo report nella fase post-integration-test.

+0

Grazie, tali argomenti della riga di comando erano davvero utile per me nella comprensione cosa fa il maven dietro le quinte. Niente davvero mi ha colpito, quindi ho appena iniziato a commentare i plugin fino a quando ho scoperto quanto segue. * modifica - inserisci la scoperta in modifica 2 sulla domanda –

0

Solo un aggiunta alle risposte già dato. Potrebbe accadere che nella configurazione del tuo plugin maven-surefire usi già la configurazione argLine per sovrascrivere qualcosa come la memoria utilizzata. Se lo fai, l'argline set di jacoco-maven-plugin non verrà utilizzato senza generare il report jacoco. In questo caso, assegnare un nome di proprietà alla configurazione jacoco-maven-plugin e quindi fare riferimento al parametro argLine di 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>