22

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)

このエラー メッセージは、プラグインの構成にdestfileand指定子を含めるかどうかに関係なく表示されます。datafile

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

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

4

5 に答える 5

29

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>

お役に立てば幸いです

于 2012-09-17T12:28:53.360 に答える
20

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

デフォルトでは、jacoco プラグインはテスト フェーズの前に「実行」され (通常、ライフサイクルの初期化prepare-agentフェーズでゴールを実行します)、実行時に「argLine」という Maven プロパティを次のように設定するだけです。-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/ に設定/target/jacoco.exec へ

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

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

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

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

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

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

ただし、親 pom が既にプラグイン<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 の実行 default-test に失敗しました: フォークされた VM は適切に別れを告げずに終了しました。VM クラッシュまたは System.exit が呼び出されましたか? [エラー] コマンド was/bin/sh -c cd ...java '${argLine}' ...

jacoco は、実行時に argLine という名前のプロパティに「追加」するだけであることがわかります。そのため、pomに a を安全に追加でき<properties><argLine></argLine></properties>ます (親 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 で動作しましたが、ソナーをホースで接続しました。理由がわからない。代わりに時間を解析する方法を変更したので、ゾーンをいじる必要はありませんでした (つまり、コードで「正しく取得」しました)。

于 2015-04-30T18:31:38.917 に答える
10

また、この問題にも遭遇しました。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>
于 2014-08-29T15:18:29.390 に答える
0

私は構成を使用します:

    <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-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
于 2012-09-05T09:13:21.900 に答える