2015-10-23 8 views
7

Ich habe Probleme bei der Generierung von AHP-Berichten über JaCoCo in einem meiner Module. Wenn der Build beginnt, sehe ich JaCoCo richtig argLine mit der Einstellung:JaCoCo erzeugt jacoco.exec erst nach dem Überspringen der JaCoCo-Ausführung

[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 

Allerdings hat die .exec nicht durch die Zeit Maven versucht erstellt wurde noch JaCoCo auszuführen:

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

Die jacoco. exec wird schließlich erstellt, nachdem Maven die Ausführung von JaCoCo übersprungen hat. Daher kann ich immer noch AHP-Berichte generieren, wenn ich den Build ohne Reinigung erneut starte.

Ich habe in verschiedenen anderen Fragen gesehen, dass ich mit Maven Surefire mit JaCoCo vorsichtig sein muss. Allerdings verwende ich argLine nicht explizit in meinen Surefire-Plugins oder in irgendeinem Plugin für diese Angelegenheit. Ich beginne mich zu fragen, ob eines der anderen Plugins den Parameter argLine automatisch kapert, wie es JaCoCo tut. Hier

ist eine Liste aller Plugins verwendet:

  • jacoco-Maven-Plugin
  • VertX-Maven-Plugin
  • Maven-Ressourcen-Plugin
  • Maven-Abhängigkeit-Plugin
  • maven-surefire-plugin
  • maven-failsafe-plugin
  • maven-todefire-bericht -plugin
  • Maven-Montage-Plugin

ich eine verdächtige Nachricht in der Build-Ausgabe sehen:

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

Ich bin nicht sicher, ob das ist relevant, aber es scheint, zweimal vor dem Skipping Nachricht und erscheint nicht in einem Modul, in dem JaCoCo ordnungsgemäß funktioniert.

Irgendwelche Ideen?

* edit - Hier ist die 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> 

Ich bin nicht sicher genau das, was der Plugin-Management-Teil tut, aber es nicht aus behebt nichts zu kommentieren. Ich habe auch versucht, die JaCoCo-Plugin-Konfiguration über die todsichere/fehlersichere Konfiguration zu setzen, falls die Reihenfolge für Plugins wichtig ist, die die gleichen Ziele teilen, aber das hat auch nicht geholfen.

* bearbeiten 2 - Sieht so aus, als ob das Problem von todsicheren enthält. Wenn Sie sie auskommentieren, wird die JaCoCo-Generierung von .exec korrigiert und JaCoCo funktioniert ordnungsgemäß.

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

Wer weiß warum?

+0

ich denke, u sind Problem in Lifecycle, zeigen pom jacoco-Plugin-Konfiguration –

+0

@question_maven_com Hinzugefügt –

Antwort

2

Um dieses Problem zu lösen, würde ich die folgenden drei Schritte aus:

  1. fest, welche Plug-Ausführung ist die jacoco.exec Datei zu erzeugen.Zu diesem Zweck können Sie Maven mit aktivierter Debug-Protokollierung (mvn -X) ausführen und in der Ausgabe nach dem Eigenschaftsnamen jacoco.agent.argLine oder seinem Wert suchen. Sie können sich auch das effektive POM (mvn help:effective-pom) ansehen, falls die entsprechende Konfiguration vom übergeordneten POM stammt. Beachten Sie, dass ich davon ausgehe, dass es sich um eine Ausführung des maven-failsafe-plugin handelt.

  2. Bestimmen Sie die Phase, in der das Plugin ausgeführt wird. für maven-failsafe-plugin wäre dies wahrscheinlich integration-test.

  3. Ändern Sie die Konfiguration des JaCoCo-Plugins, so dass das Ziel report später im build lifecycle ausgeführt wird. Z.B. Wenn die Datei jacoco.exec in der Phase integration-test produziert wird, können Sie das Ziel report in der post-integration-test Phase ausführen.

+0

Danke, waren die Befehlszeilenargumente für mich zu verstehen wirklich hilfreich Was macht Maven hinter den Kulissen? Nichts fiel mir wirklich auf, also habe ich angefangen, Plugins zu kommentieren, bis ich folgendes entdeckte. * edit - setze die Entdeckung in Edit 2 auf Frage –

0

nur eine Ergänzung zu den bereits gegebenen Antworten. Es könnte passieren, dass Sie in Ihrer Maven-Surefire-Plugin-Konfiguration bereits die argLine-Konfiguration verwenden, um etwas wie den verwendeten Speicher zu überschreiben. Wenn Sie dies tun, wird die von jacoco-maven-plugin gesetzte Argline nicht verwendet, wenn der jacoco-Bericht nicht generiert wird. In diesem Fall weisen Sie der jacoco-maven-plugin-Konfiguration einen Eigenschaftsnamen zu und referenzieren ihn dann in Ihrem maven-surefire-plugin argLine-Parameter.

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