2016-03-30 49 views
10

Abbiamo un progetto multi modulo Maven composto da un genitore (HelloWorld) e diversi bambini (HelloWorldServices e HelloWorldPresentation) e uso Jenkins per la compilazione.JaCoCo con Maven - manca il file di dati di esecuzione

L'errore dopo aver eseguito il test di successo è

[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 

Le linee prima che dice

[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 

Ecco come ho definito il plugin genitore 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> 

In no pom ho menzionato esplicitamente surefire. Ho anche provato quello che trovi ovunque per mettere l'argLine nella configurazione ma tutto con lo stesso risultato. Il file JaCoCo .exec non è mai stato creato, qualunque cosa io faccia. Per quanto riguarda gli obiettivi, io uso

mvn clean install jacoco:prepare-agent jacoco:report 

Da quando Tralascio gli obiettivi jacoco, che non ha nemmeno visualizza il messaggio INFO.

+1

try 'mvn clean jacoco: prepare-agent install' invece (l'agente tra le due fasi) –

risposta

18

Non si dovrebbe richiamare l'agente dopo la fase di installazione, ma prima, quindi invece di invocare:

mvn clean install jacoco:prepare-agent jacoco:report 

Si dovrebbe richiamare

mvn clean jacoco:prepare-agent install jacoco:report 

Il motivo principale è: l'agente non parteciperà alla il ciclo di vita di build, la fase test verrà già eseguita come parte della fase install, quindi Maven eseguirà l'agente come da richiamo della riga di comando, ma sarà troppo tardi.


Probabilmente si dovrebbe anche cambiare la configurazione del plugin di cui sopra per:

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

Nota: ho rimosso la sezione di configurazione, perché in realtà è stato rivolto ai valori di default. Inoltre, gli elementi XML sono case sensitive qui, quindi il tuo elemento datafile è stato semplicemente ignorato, dovrebbe invece essere dataFile. Lo stesso vale per destFile.

Il prepare-agent obiettivo sta già utilizzando ${project.build.directory}/jacoco.exec come predefinito destFile valore, la stessa applicata al valore dataFile per la report obiettivo. La ragione principale di questo cambiamento sarebbe una build più flessibile e standard, non fare affidamento su artifactId come nome del progetto (predefinito ma non obbligatorio) e utilizzare la proprietà più generica ${project.build.directory} per puntare direttamente su target.


Nota finale: assicurarsi di configurare le esecuzioni Jacoco Plugin all'interno della sezione build/plugins e non build/pluginManagement/plugins sezione. La sezione pluginManagement è destinata alla governance e all'armonizzazione comune di versioni o configurazioni, ma sarà ignorata se il plug-in corrispondente non verrà dichiarato in build/plugins.
Secondo official Maven POM reference

pluginManagement: è un elemento che viene visto lungo plugin laterali. La gestione dei plug-in contiene elementi di plug-in allo stesso modo, ad eccezione del fatto che piuttosto che configurare le informazioni sui plugin per questa particolare build di progetto, è inteso per configurare le build di progetto che ereditano da questa. Tuttavia, questo configura solo i plugin che sono effettivamente referenziati all'interno dell'elemento plug-in nei bambini. I bambini hanno tutto il diritto di ignorare le definizioni pluginManagement.

(nota: in grassetto è mio)

+0

cosa devo fare per farlo funzionare quando si chiama' mvn install'? Se non richiamo esplicitamente gli obiettivi jacoco, non verranno eseguiti. – dasLort

+0

@dasLort quale versione di Maven stai usando? Non è stato possibile riprodurre il problema con un progetto multi modulo di esempio, non ho ricevuto alcun avviso di salto e ho ricevuto correttamente rapporti jacoco –

+0

Maven 3.3.9 e (Jenkins) Maven Integration Plugin 2.12.1. Quindi tu dici che puoi 'mvn install' e con la configurazione sopra chiamata jacoco? – dasLort

2

penso che "destfile" e "file di dati" sono case sensitive in modo da cercare di sostituirli con "destfile" e "file di dati", forse che funzionerà:)