web-dev-qa-db-ja.com

Mavenを使用したJaCoCo-実行データファイルがない

親(HelloWorld)と異なる子(HelloWorldServicesおよびHelloWorldPresentation)で構成されるMavenマルチモジュールプロジェクトがあり、Jenkinsを使用してビルドします。

成功したテストを実行した後のエラーは

[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

それが言う前の行

[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

これは私が親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>

ポンポンで確実に言及したことはありませんでした。また、どこにでもあるものを見つけてargLineを構成に入れましたが、すべて同じ結果になりました。 JaCoCo .execファイルは、私が何をしようとも、一度も作成されたことはありません。目標に関しては、私は

mvn clean install jacoco:prepare-agent jacoco:report

Jacocoゴールを省略すると、INFOメッセージも表示されないためです。

18
dasLort

インストールフェーズの後ではなく、前にエージェントを呼び出す必要があります。そのため、呼び出す代わりに:

mvn clean install jacoco:prepare-agent jacoco:report

呼び出す必要があります

mvn clean jacoco:prepare-agent install jacoco:report

主な理由は、エージェントがビルドライフサイクルに参加せず、testフェーズがinstallフェーズの一部として既に実行されている場合、Mavenがコマンドライン呼び出しに従ってエージェントを実行することです。 、しかし手遅れになります。


おそらく、上記のプラグイン構成も次のように変更する必要があります。

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

注:構成セクションは実際にはデフォルト値を指していたため、削除しました。さらに、ここではXML要素は大文字と小文字が区別されるため、datafile要素は単に無視され、代わりにdataFileである必要がありました。 destFileにも同じことが当てはまります。

prepare-agent 目標は、既にデフォルトのdestFile値として${project.build.directory}/jacoco.execを使用しています。これは dataFile値にも適用されますreport 目標。この変更の主な理由は、プロジェクト名としてartifactIdに依存せず(デフォルトですが、必須ではない)、より汎用的な${project.build.directory}プロパティを使用して、より柔軟で標準的なビルドになりますtargetで直接。


最後の注意:build/pluginsセクションではなく、build/pluginManagement/pluginsセクション内でJacocoプラグインの実行を設定してください。 pluginManagementセクションは、バージョンまたは構成のガバナンスおよび一般的な調和を目的としていますが、対応するプラグインがそうでない場合はignoredになりますbuild/pluginsで宣言されています。
公式Maven POMリファレンス

pluginManagement:プラグインの横に表示される要素です。プラグイン管理には、この特定のプロジェクトビルドのプラグイン情報を構成するのではなく、このプロジェクトビルドを継承するプロジェクトビルドを構成することを除いて、ほぼ同じ方法でプラグイン要素が含まれます。 ただし、これは、子のplugins要素内で実際に参照されるプラグインのみを構成します。子にはpluginManagement定義をオーバーライドするすべての権利があります。

(注:太字は私のものです)

30
A_Di-Matteo

「destfile」と「datafile」は大文字と小文字が区別されると思うので、「destFile」と「dataFile」に置き換えてみてください。

3
Bogdan Halmaghi
  • JaCoCoレポートは、実行データファイルから作成されます。
  • このファイルが存在しない場合、JaCoCoレポートの目標はレポートの作成をスキップします。
  • そのため、実行データファイルの作成は必須です。

実行データファイルが作成されない理由は次のとおりです。
-テストはありません。
-すべてのテストは無視されます。
-Surefireプラグインがありません。
-JaCoCoのprepare-agentゴールは実行されません。
-SurefireプラグインはJaCoCoのエージェントで構成されていません。

1