web-dev-qa-db-ja.com

Maven JaCoCoプラグインエラー

Pom.xmlファイルでMaven JaCoCoプラグインを次のように構成しました。

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

Windows 7とApache-maven-3.0.4プラグインを使用しています。 cygwinターミナルまたはコマンドプロンプトターミナルからmvn -P jacoco4 installと入力すると、MavenがJaCoCoプラグインをダウンロードして実行しますが、jacoco.execファイルが作成されていないようです。エラーメッセージは次のとおりです。

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

プラグインの構成にdestfileおよびdatafile指定子を含めるかどうかにかかわらず、このエラーメッセージが表示されます。

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

誰かが私が間違っていることを教えてもらえますか?

21
kirigiri

私はjacocoとmavenでも同じ問題を抱えていました。これは、親のPOMがsurefireの構成を上書きすることに関連していました。この場合、そのプラグインはエージェントを定義する引数(jvm引数用)を使用しませんでした。

解決策は、「argLine」構成要素を戻すことでした

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

完全なプラグイン設定は次のようになります

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

それが役に立つことを願っています

22
Sylvain

OK何が起こっているのか理解できたと思います。

デフォルトでは、jacocoプラグインはテストフェーズの前に「実行」され(通常、 初期化 ライフサイクルフェーズ中にprepare-agentゴールを実行します)、実行時にmavenプロパティを設定します。 「argLine」を-javaagent=jacoco.jarのようなものに

例:

[情報] argLineを-javaagent:/usernamed/.m2/repository/org/jacoco/org.jacoco.agent/ 0.5.6.201201232323/org.jacoco.agent-0.5.6.201201232323-runtime.jar = destfile =/path /に設定to/target/jacoco.exec

デフォルトでは、maven-surefire-pluginは基本的にこのプロパティを(何かに設定されている場合)フォークされたJavaテストプロセスに追加するので、商品を取得します。例:Java ${argLine ends up here}> -jar /xxx/surefirebooter3741906822495182152.jar

通常(jacocoなし)、alsoしたい場合は、そのargLineに独自の何かを追加します(たとえば、-Xmx1Gなど) )、次のように確実な構成で設定するだけです

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

ただし、jacocoを使用している場合、グローバルプロパティ this way (pomのルートグローバルプロパティ)を設定することにより、通常の方法で行うことはできません。

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

<configuration><argLine>を設定すると、基本的にシステムプロパティがオーバーライドされるため、jacoco引数は子プロセスに渡されません。そのため、代わりにプロパティの方法を使用します。プロパティargLineを指定すると、jacocoは指定したものにパラメーターを追加するだけで、surefireはそれを使用します。

ただし、親のPOMにalreadyがある場合は、プラグインの<configuration><argLine>を何かに設定しますか?それとも、自分で設定している場合は?基本的に、jacocoが設定するプロパティの代わりにその値を使用します(手動オーバーライドを指定しました)。

自分で<configuration><argLine>を指定している場合、そのargLineをプロパティに変更し(上記を参照)、<configuration><argLine>を削除すると動作します。親を制御できず、親がarglineに何かを指定している場合、<configuration><argLine>${argLine} -Xmx1G</argLine>ルートに進む必要があります。これは、親がこの値に設定したものを無視し、代わりにargLineを使用するように指示することです(jacocoが設定します)。 (親pomがこの値に対して持っている値に簡単に「追加」する方法があるかどうか、ここでコメントしてください。

しかし、jacocoが特定のターゲットまたはプロファイルに対して実行されない場合はどうなりますか?その後、変数${argLine}は設定されず、次のようなエラーが発生する可能性があります。

ゴールの実行デフォルトテストorg.Apache.maven.plugins:maven-surefire-plugin:2.14:test failed:The fork VM適切にさよならを言わずに終了しました。VM crashまたはSystem.exitが呼び出されましたか?[エラー]コマンドwas/bin/sh -c cd ... Java '$ {argLine}' ...

さて、jacocoは、実行時にargLineという名前のプロパティに「追加」するだけです。したがって、<properties><argLine></argLine></properties>をあなたのPOMに安全に追加できます(親POMで既にそのセットを持っている場合を除き、何も追加する必要はありません)。 jacocoが呼び出されると、追加されます。そうでない場合は、空の文字列に設定されますが、これは問題ありません。プロパティの親の値に「追加」する方法があるかどうかも不明であるため、存在することがわかっている場合はそれを継承するか、空として指定します。

だから、私にとって最後に、上流の(アクセスできない)親pomが次のように宣言したので、

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

それは、(私の制御の範囲外で)親ポンにすでに設定されているため、基本的にそのルートに従うことを余儀なくされました:

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

注:Intellijが文句を言い、POMにこれがある場合、ユニットテストに「設定を追加しません」:

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

ただし、argLineという名前のプロパティを宣言しないでください(コマンドラインmvnで正常に機能しますが)。修正/回避策:空の 'argLine'グローバルプロパティを宣言するか、または代わりに-DcustomOption=Xをプロパティ宣言に移動してください。上記を参照してください。プロパティ宣言で「のみ」設定した場合、IntelliJがそれを取得するには、<configuration><argLine>${argLine}</argLine>...も必要になります:|

残念ながら、これでも十分ではありませんでしたが、IntelliJ + mavenで動作しましたが、ソナーにホースをかけました。理由はわかりません。代わりに時間を解析する方法を変更したので、ゾーンをいじる必要はありませんでした(つまり、コード内で「正しく取得」しました)。

16
rogerdpack

また、この問題に遭遇しました。JaCoCoは「jacoco.exec」出力ファイルを生成しません。つまり、コードカバレッジ分析は行われません。

私の場合、JaCoCo MavenプラグインargLineをオーバーライドしたMaven SurefireプラグインでカスタムargLineを使用したため、JaCoCoが実行されなかったためです。

これを修正するために、JaCoCoのオプションパラメータ「propertyName」を使用してargLineをMavenプロパティにエクスポートし、Surefire argLineに含めました。

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

ただし、Netbeansで個々のテストを実行すると、これが問題を引き起こしました。このシナリオではJaCoCoプラグインが実行されなかったため、テストを実行する前に「jacoco.agent.argLine」変数は初期化されず、Surefireは失敗しました。

空のプロパティ "jacoco.agent.argLine"をpomに追加すると、単一のテストを実行する際の問題は解決しましたが、これにより、実行中にJaCoCoがargLineをエクスポートできなくなり、JaCoCoが事実上無効になりました。

私が使用したソリューションの最後の部分は、空のプロパティを作成し、単一のテストが指定された場合にのみアクティブになるプロファイルを追加することでした。

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

私は同じ問題に直面し、jacoco:reportの代わりに以下のコマンドを使用して修正しました-

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

参照- コマンドラインからJaCoCo mavenプラグインを設定する方法

1
Sanchi Girotra

私は構成を使用します:

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

更新: sonar(sonar-pom.xml)によって生成された構成:

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

1つの問題-ビルドごとに「jacocoagent3671192291664069011.jar」を定義する方法。次の場所にある必要があります。

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