モジュールの1つでJaCoCoを介してAHPレポートを生成できません。ビルドが開始すると、JaCoCoがargLineを正しく設定していることがわかります。
[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
ただし、.execは、mavenがJaCoCoを実行しようとする時点ではまだ作成されていません。
[INFO] Skipping JaCoCo execution due to missing execution data file:<...>/target/jacoco.exec
MavenがJaCoCoの実行をスキップした後、最終的にjacoco.execが作成されます。したがって、クリーニングせずにビルドを再実行すると、AHPレポートを生成できます。
他のさまざまな質問で、JaCoCoでMaven Surefireを注意して使用する必要があることを確認しました。ただし、Surefireプラグイン、またはそれに関するプラグインでargLineを明示的に使用することはありません。 JaCoCoのように、他のプラグインの1つがargLineパラメーターを自動的にハイジャックしているのではないかと思い始めています。
使用されるすべてのプラグインのリストは次のとおりです。
ビルド出力に疑わしいメッセージが1つあります。
[INFO] --- maven-compiler-plugin:3.0:compile (default-compile) @ <module> ---
[INFO] Changes detected - recompiling the module!
それが関連するかどうかはわかりませんが、Skipingメッセージの前に2回表示され、JaCoCoが正常に動作するモジュールには表示されません。
何か案は?
*編集-これはjacocoの設定です
<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>
そのプラグイン管理部分が何をしているのか正確にはわかりませんが、コメントアウトしても何も修正されません。また、同じ目標を共有するプラグインの順序が重要な場合に備えて、JaCoCoプラグインの設定をsurefire/failsafeの設定の上に配置しようとしましたが、それも助けにはなりませんでした。
*編集2-問題は確実に含まれているようです。それらをコメントアウトすると、JaCoCoの.exec生成が何らかの形で修正され、JaCoCoは適切に動作します。
<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>
誰もが理由を知っていますか?
既に与えられた答えへの追加。 maven-surefire-plugin構成で既にargLine構成を使用して、使用されているメモリなどをオーバーライドしている可能性があります。これを行うと、jacoco-maven-pluginによって設定されたarglineは使用されず、jacocoレポートの生成に失敗します。この場合、プロパティ名をjacoco-maven-plugin configに割り当ててから、maven-surefire-plugin argLineパラメーターでそれを参照します。
<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>
この問題を解決するには、次の3つの手順を使用します。
どのプラグインの実行がjacoco.exec
ファイルを生成しているかを判断します。これを行うには、デバッグロギングを有効にして(mvn -X
)Mavenを実行し、出力でjacoco.agent.argLine
プロパティ名またはその値を探します。関連する構成が親POMからのものである場合、有効なPOM(mvn help:effective-pom
)を確認することもできます。私の推測では、maven-failsafe-plugin
の実行であることに注意してください。
プラグインが実行されるフェーズを決定します。 maven-failsafe-plugin
の場合、これはおそらくintegration-test
になります。
JaCoCoプラグインの構成を変更して、report
目標が ビルドライフサイクル の後半で実行されるようにします。例えば。 jacoco.exec
ファイルがintegration-test
フェーズで作成された場合、post-integration-test
フェーズでreport
ゴールを実行できます。
解決策は見つかりませんでしたが、次のことを行いました。
mvn clean jacoco:prepare-agent installファイルjacoco.execを作成しますが、ファイルを作成せずにmvn sonar:sonarを実行します。
解決:
ステップ1:mvn clean jacoco:prepare-agent install
ステップ2:/ src/main/resourcesからファイルjacoco.execをコピーステップ3:
pom.xmlに次のプラグインを追加
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>
${basedir}/target/</outputDirectory>
<resources>
<resource>
<directory>
${basedir}/src/main/resources/ </directory>
<includes>
<include>jacoco.exec</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
<configuration>
<encoding>cp1252</encoding>
</configuration>
</plugin>
ステップ4:mvn clean install
ステップ5:
mvn sonar:sonar
セクションプラグインを追加
<pluginManagement>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>cp1252</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>
${basedir}/target/</outputDirectory>
<resources>
<resource>
<directory>
${basedir}/src/main/resources/ </directory>
<includes>
<include>jacoco.exec</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
<execution>
<id>copy-folder</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}</outputDirectory>
<resources>
<resource>
<filtering>false</filtering>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
<configuration>
<encoding>cp1252</encoding>
</configuration>
</plugin>
<!-- Plugin Sonar -->
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.1</version>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.6.201602180812</version>
<configuration>
<destFile>${project.build.directory}/jacoco.exec</destFile>
</configuration>
<executions>
<execution>
<id>jacoco-initialize</id>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<destFile>${basedir}/target/jacoco.exec</destFile>
<dataFile>${basedir}/target/jacoco.exec</dataFile>
</configuration>
</execution>
<execution>
<id>jacoco-site</id>
<phase>package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
私にとっては、execファイルが生成されない理由の1つは、prepare-agent、prepare-packageゴールをpluginManagementのpluginセクション内に配置したときです
同じ外部pluginManagementを試してみたところ、同じものを正常に実行でき、javn-execファイルはmvn clean installコマンドを使用して生成されました
私のpomfileは次のとおりです:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>mmt</groupId>
<artifactId>jacoco</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>jacoco</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<argLine>-Xms256m -Xmx1524m -XX:MaxPermSize=256m -Duser.language=en</argLine>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.Apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.7.201606060606</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>
</build>
</project>