web-dev-qa-db-de.com

Maven JaCoCo-Plugin-Fehler

Ich habe das Maven JaCoCo-Plugin in meiner pom.xml-Datei wie folgt konfiguriert:

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

Ich verwende Windows 7 und das Plugin Apache-maven-3.0.4. Wenn ich mvn -P jacoco4 install entweder von einem cygwin-Terminal oder von einem Eingabeaufforderungsterminal aus eingebe, lädt Maven das JaCoCo-Plugin herunter und führt es aus, aber die jacoco.exec-Datei scheint nicht erstellt worden zu sein. Unten ist die Fehlermeldung:

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

Diese Fehlermeldung wird angezeigt, unabhängig davon, ob ich die destfile- und datafile-Spezifizierer in die Konfiguration des Plugins einbezieht oder nicht:

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

Kann mir bitte jemand sagen, was ich falsch mache?

19
kirigiri

Ich hatte das gleiche Problem mit jacoco und maven . Es stand im Zusammenhang mit einem übergeordneten Pom, der die Konfiguration von surefire überschrieb ..__ In diesem Fall verwendete das Plugin nicht das Argument (für das Argument jvm), das den Agenten definiert.

Die Lösung bestand darin, das Konfigurationselement "argLine" zurückzusetzen

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

Full Plugin Conf sieht aus wie

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

Ich hoffe es wird nützlich sein

22
Sylvain

OK, ich glaube, ich habe herausgefunden, was los ist.

Standardmäßig wird das Jacoco-Plugin vor der Testphase "ausgeführt" (normalerweise wird das prepare-agent-Ziel in der initialize lifecycle-Phase ausgeführt). Wenn es ausgeführt wird, setzt es eine Maven-Eigenschaft namens "argLine" auf etwas wie -javaagent=jacoco.jar.

ex:

[INFO] argLine ist auf -javaagent gesetzt: /usernamed/.m2/repository/org/jacoco/org.jacoco.agent/ 0.5.6.201201232323/org.jacoco.agent-0.5.6.201201232323-runtime.jar = destfile =/path/nach/target/jacoco.exec

Standardmäßig setzt maven-surefire-plugin diese Eigenschaft (wenn sie auf irgendetwas gesetzt ist) ihren verzweigten Java-Testprozessen im Voraus vor, so dass sie die Waren erhalten. ZB: Java ${argLine ends up here}> -jar /xxx/surefirebooter3741906822495182152.jar

Normalerweise (ohne jacoco), wenn Sie auch zu dieser argLine (z. B. -Xmx1G oder Ähnliches) etwas anderes hinzufügen möchten, setzen Sie es einfach in die todsichere Konfiguration, wie z

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

Wenn Sie jedoch jacoco verwenden, können Sie dies nicht auf die normale Art und Weise tun, indem Sie eine globale Eigenschaft festlegen - auf diese Weise (dies ist die globale Eigenschaft des Pom):

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

Wenn Sie den <configuration><argLine> setzen, überschreibt er grundsätzlich die Systemeigenschaft, so dass Jacoco-Argumente nicht an den untergeordneten Prozess weitergegeben werden. Deshalb verwenden Sie stattdessen die Eigenschaftsweise. Wenn Sie eine Eigenschaft argLine angeben, fügt jacoco die Parameter einfach zu dem hinzu, was Sie angeben, und surefire verwendet es.

Was ist jedoch, wenn Ihr Eltern-Pom bereits den <configuration><argLine> des Plugins auf etwas gesetzt hat? Oder wenn Sie es selbst einstellen? Dieser Wert wird grundsätzlich anstelle der von jacoco festgelegten Eigenschaft verwendet (Sie haben eine manuelle Überschreibung angegeben).

Wenn Sie <configuration><argLine> selbst angeben, können Sie diese argLine in eine Eigenschaft ändern (siehe oben) und den <configuration><argLine> entfernen, und es sollte funktionieren. Wenn Sie das übergeordnete Element nicht steuern können und das übergeordnete Element etwas für Argline angibt, müssen Sie die <configuration><argLine>${argLine} -Xmx1G</argLine>-Route wählen. Hiermit wird der Befehl angewiesen, den Wert, auf den der übergeordnete Wert gesetzt ist, zu ignorieren und stattdessen argLine zu verwenden (der eine Jacoco wird für Sie festgelegt). (Es ist mir unklar, ob es einen einfachen Weg gibt, den Wert, den das übergeordnete Pom für diesen Wert hat, "hinzuzufügen"), wenn jemand weiß, wie man sich hier frei äußern kann.

Was aber, wenn Jacoco nicht für ein Ziel oder ein Profil läuft? Dann wird die Variable ${argLine} nie gesetzt, und Sie können einen Fehler wie den folgenden ausführen:

Ausführung Default-Test des Ziels org.Apache.maven.plugins: maven-surefire-plugin: 2.14: Test fehlgeschlagen: Die gegabelten VM wurden beendet, ohne sich von ihnen zu verabschieden. VM Absturz oder System.exit genannt? [ERROR] Befehl war/bin/sh -c cd ... Java '$ {argLine}' ...

Nun, es stellt sich heraus, dass jacoco die Eigenschaft argLine nur dann "hinzufügt", wenn sie ausgeführt wird. Sie können also sicher einen <properties><argLine></argLine></properties> zu Ihrem Pom hinzufügen (sofern Sie den Satz nicht bereits im übergeordneten Pom festgelegt haben, müssen Sie nichts hinzufügen). Wenn Jacoco jemals aufgerufen wird, wird es hinzugefügt. Wenn nicht, ist es auf eine leere Zeichenfolge gesetzt, was OK ist. Es ist auch unklar, ob es eine Möglichkeit gibt, den Wert eines übergeordneten Objekts für eine Eigenschaft "hinzuzufügen". Es wird also entweder das Objekt geerbt, wenn es bekannt ist, oder als leer angegeben.

Am Ende also für mich, da mein vorgelagertes (unzugängliches) Elternteil pom es als deklariert hat 

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

Ich war gezwungen, diesen Weg im Wesentlichen zu verfolgen, da er bereits in einem (außerhalb meiner Kontrolle befindlichen) Eltern-Pom festgelegt war, also:

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

Bitte beachten Sie, dass sich Intellij bei Ihrem Gerätetest beschwert und keine Einstellungen hinzufügt, wenn Sie Folgendes in Ihrem Pom haben:

<configuration><argLine>${argLine} -DcustomOption=X...</argLine>

aber deklarieren Sie keine Eigenschaft namens argLine (obwohl dies in der Kommandozeile mvn gut funktioniert). Fix/Workaround: Deklarieren Sie eine leere globale Eigenschaft 'argLine' und/oder verschieben Sie stattdessen Ihren -DcustomOption=X in die Eigenschaftendeklaration, siehe oben. Wenn Sie es "nur" in der Eigenschaftsdeklaration setzen, benötigen IntelliJ auch <configuration><argLine>${argLine}</argLine>...: |

13
rogerdpack

Ich bin auch auf dieses Problem gestoßen: JaCoCo erzeugt keine Ausgabedatei 'jacoco.exec', was bedeutet, dass keine Analyse der Codeabdeckung erfolgt. 

In meinem Fall lag es auch an der Verwendung einer benutzerdefinierten argLine im Maven Surefire Plugin, die das JaCoCo Maven Plugin argLine überschrieb, wodurch JaCoCo nicht ausgeführt wurde.

Um dies zu beheben, habe ich den optionalen JaCoCo-Parameter "propertyName" verwendet, um seine argLine in eine Maven-Eigenschaft zu exportieren, und dies in die Surefire argLine aufgenommen:

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

Dies führte jedoch zu einem Problem, wenn einzelne Tests in Netbeans ausgeführt wurden. Da das JaCoCo-Plugin in diesem Szenario nicht ausgeführt wurde, wurde die Variable "jacoco.agent.argLine" nicht initialisiert und Surefire schlug fehl, bevor Tests ausgeführt wurden. 

Das Hinzufügen einer leeren Eigenschaft "jacoco.agent.argLine" zum Pom behebte das Problem beim Ausführen einzelner Tests. Dies hinderte JaCoCo jedoch auch daran, seine argLine zu exportieren, als sie ausgeführt wurde, wodurch JaCoCo effektiv deaktiviert wurde. 

Der letzte Teil der von mir verwendeten Lösung bestand darin, ein Profil hinzuzufügen, das die leere Eigenschaft erstellt und nur aktiviert wird, wenn ein einzelner Test angegeben wird:

<profiles>
    <profile>
        <activation>                
            <property>
                <name>test</name>      
            </property>
        </activation>
        <properties>
            <jacoco.agent.argLine></jacoco.agent.argLine>
        </properties>
    </profile>
</profiles>
7
jimr

Ich verwende die Konfiguration:

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

Update: Von Sonar (sonar-pom.xml) erzeugte Konfiguration:

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

Ein Problem - wie man "jacocoagent3671192291664069011.jar" für jeden Build definiert. Es sollte in sein:

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

Ich stand vor demselben Problem und behebte mich mit dem folgenden Befehl anstelle von jacoco: report - 

mvn -X org.jacoco:jacoco-maven-plugin:report 

Referenziert - So konfigurieren Sie das JaCoCo-Maven-Plugin von der Befehlszeile aus

0
Sanchi Girotra