我正在使用带有jacoco插件的maven来生成代码覆盖率指标。 我有在配置由jacoco插件所需的Java选项万无一失插件一些困难。 我已经在Stack Overflow上看到了一些关于此问题的答案,但有些东西对我不起作用。

我有一个多模块项目,我的一个模块配置了surefire插件,如下所示:

foo/pom.xml

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
      <argLine>-XX:MaxPermSize=512m</argLine>
    </configuration>
  </plugin>
</plugins>

这按预期工作。

现在我想结合jacoco获取代码覆盖率的指标,所以我加了一个代码覆盖率配置文件,处理所有jacoco配置:

parent/pom.xml

<profile>
  <id>CodeCoverage</id>
  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.jacoco</groupId>
          <artifactId>jacoco-maven-plugin</artifactId>
          <executions>
            <execution>
              <id>jacoco-initialize</id>
              <goals><goal>prepare-agent</goal></goals>
              <configuration>
                <propertyName>surefire.argLine</propertyName>
              </configuration>
              ...
            </execution>
          <executions> 
        </plugin>
      </plugins>
    </pluginManagement>
  </build>   
</profile>

它是在这里看到,如果指定的代码覆盖率配置文件,然后jacoco插件配置为使用surefire.argLine属性,该属性是用来配置argLine万无一失插件。

然后我更新为Foo模块使用pom.xml文件surefire.argLinejacoco插件生成的属性:

foo/pom.xml

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
      <argLine>${surefire.argLine} -XX:MaxPermSize=512m</argLine>
    </configuration>
  </plugin>
</plugins>

这种方法在jacoco插件文档中指定(参见[1])。

当我使用CodeCoverage配置文件构建foo模块时,我看到以下内容:

[foo] $ mvn clean install -X -PCodeCoverage
...
[INFO] --- jacoco-maven-plugin:0.7.0.201403182114:prepare-agent (jacoco-initialize) @ foo ---
[INFO] surefire.argLine set to -javaagent:...\\org.jacoco.agent\\0.7.0.201403182114\\org.jacoco.agent-0.7.0.201403182114-runtime.jar=destfile=...\foo\\\target\\coverage-reports\\jacoco-ut.exec
...
[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-surefire-plugin:2.13:test' with basic configurator -->
[DEBUG]   (s) argLine = -javaagent:...\\org.jacoco.agent\\0.7.0.201403182114\\org.jacoco.agent-0.7.0.201403182114-runtime.jar=destfile=...\\foo\\target\\coverage-reports\\jacoco-ut.exec -XX:MaxPermSize=512m
...
[INFO] --- jacoco-maven-plugin:0.7.0.201403182114:report (jacoco-site) @ foo ---
[INFO] Analyzed bundle 'Foo' with 59 classes`

因此,在执行jacoco插件,一个surefire.argLine属性被创建时, argLine万无一失插件使用surefire.argLine财产和当地MaxPermSize一个参数, target\\code-coverage\\jacoc-ut-exec时生成的文件,正如所料。

但是,如果我不使用CodeCoverage配置文件,那么我会收到错误,因为${surefire.argLine}属性(在foo/pom.xml )不是由jacoco插件创建的,并且未在任何地方定义:

[foo] $ mvn clean install -X
...
[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-surefire-plugin:2.13:test' with basic configurator -->
[DEBUG]   (s) argLine = ${surefire.argLine} -XX:MaxPermSize=512m
...
Error: Could not find or load main class ${surefire.argLine}`

SINEC没有被引用的jacoco插件,没有surefire.argLine创建属性,因此错误。

所以,我回到parent/pom.xml并创建此属性,没有初始值:

parent/pom.xml

<properties>
  <surefire.argLine></surefire.argLine>
</properties>

现在,当我在不使用CodeCoverage配置文件的情况下构建foo模块时,我没有收到任何错误:

[foo] $ mvn clean install -X
...
[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-surefire-plugin:2.13:test' with basic configurator -->
[DEBUG]   (s) argLine =  -XX:MaxPermSize=512m
...
[INFO] BUILD SUCCESS`

万无一失 argline现在是正确的(使用空surefire.argLine财产)和没有target\\code-coverage目录,符合市场预期。

所以现在我回到使用CodeCoverage配置文件生成代码指标:

[foo] $ mvn clean install -X -PCodeCoverage
...
[INFO] --- jacoco-maven-plugin:0.7.0.201403182114:prepare-agent (jacoco-initialize) @ foo ---
[INFO] surefire.argLine set to -javaagent:...\\org.jacoco.agent\\0.7.0.201403182114\\org.jacoco.agent-0.7.0.201403182114-runtime.jar=destfile=...\\foo\\target\\coverage-reports\\jacoco-ut.exec
...
[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-surefire-plugin:2.13:test' with basic configurator -->
[DEBUG]   (s) argLine =  -XX:MaxPermSize=512m
...
[INFO] --- jacoco-maven-plugin:0.7.0.201403182114:report (jacoco-site) @ foo ---
[INFO] Skipping JaCoCo execution due to missing execution data file:...\foo\target\coverage-reports\jacoco-ut.exec

在这里可以观察到,jacoco插件调用和设置surefire.argLine财产,但surefire.argLine用在定义的空值属性parent/pom.xml文件实际上是用于创建的万无一失插件argline。

因此,当我使用CodeCoverage配置文件时,没有jacoco-ut.exec文件,也没有target\\code-coverage目录。

我不确定我在这里做错了什么。 我正在按照jacoco文档的建议声明一个argLine属性,并且每当一个surefire插件需要指定其他参数时使用它。 Stack Overflow上的其他答案建议创建一个与jacoco argLine属性同名的属性来处理未调用jacoco时的情况。

有什么建议?

编辑

也许一个解决方案是显式声明surefire.argLine代码覆盖率配置文件属性,而忘记使用argLinejacoco插件:

<profile>
  <id>CodeCoverage</id>
  <properties>
    <surefire.argLine>-javaagent:${jacoco.agent.jar}=destfile=${jacoco.report.path}</surefire.argLine>
  </properties>
  <build>
    <plugins>
      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>jacoco-initialize</id>
            <goals>
              <goal>prepare-agent</goal>
            </goals>
            <!-- no longer specifying 'argLine' for jacoco plugin ... -->  
          </execution>
        <executions> 
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
          <!-- ... instead the arg line is configured explicitly for surefire plugin. -->
          <argLine>${surefire.argLine}</argLine>
        </configuration>
      </plugin>
    </plugins>
  </plugin>
</build>

这将创建surefire.argLine财产使用由jacoco插件所需的Java代理,并配置万无一失插件使用该财产的JVM ARGS。 jacoco插件现在将创建一个argLine属性,但这将被忽略。 这不是一个优雅的解决方案(因为我正在假设jacoco插件如何工作,这可能会在未来版本中发生变化)。

编辑

还必须设置jacoco.agent.jar属性,方法是指向它在本地存储库中的位置(不确定这是否健壮),或者使用依赖插件将jacoco代理jar复制到本地构建目录:

<profile>
  <id>CodeCoverage</id>
  <properties>
    <jacoco.agent.jar>${project.build.directory}/jacoco-agent.jar</jacoco.agent.jar>
    ...
  </project>
  <build>
    ...
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
          <execution>
            <id>download-jacoco-agent</id>
            <phase>process-test-resources</phase>
            <goals>
              <goal>copy</goal>
            </goals>
            <configuration>
              <artifactItems>
                <artifactItem>
                  <groupId>org.jacoco</groupId>
                  <artifactId>org.jacoco.agent</artifactId>
                  <version>${jacoco.version}</version>
                  <classifier>runtime</classifier>
                  <outputDirectory>${project.build.directory}</outputDirectory>
                  <destFileName>jacoco-agent.jar</destFileName>
                </artifactItem>
              </artifactItems>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</profile>

编辑

不确定使用依赖插件是正确的方法,还是指向本地存储库中的jacoco代理工件:

<profile>
  <id>CodeCoverage</id>
  <properties>
    <jacoco.agent.jar>${settings.localRepository}/org/jacoco/org.jacoco.agent/${jacoco.version}/org.jacoco.agent-${jacoco.version}-runtime.jar</jacoco.agent.jar>
  </properties>
  ...
</profile>

这更简单,并且不需要将工件复制到本地构建目录,但是很脆弱:存储库布局中的更改将破坏这一点。

[1] http://www.eclemma.org/jacoco/trunk/doc/prepare-agent-mojo.html

===============>>#1 票数:37 已采纳

由于jacoco-maven-plugin:prepare-agent目标在maven-surefire-plugin之前执行,因此尝试将${argLine}变量添加到maven-surefire-plugin设置的argLine值中。

例:

<plugin>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.12.1</version>
  <configuration>
    <argLine>-server -ea -XX:MaxPermSize=256m -Xmx4g -XX:-UseSplitVerifier ${argLine}</argLine>
  </configuration>
</plugin>

我有同样的问题,这个解决方案对我有用,无需重新配置POM的其他部分。

===============>>#2 票数:35

尝试使用

@{argLine}

代替

${argLine}

(或者你的情况下是surefire.argLine

它允许surefire读取由其他插件修改的属性,而不是读取由Maven本身替换的属性。 然后,您可以在Maven属性argLine参数设置为空:

<properties>
    <argLine></argLine>
</properties>

现在哪个不会造成任何问题。 更多信息: 如何使用argLine中其他插件设置的属性?

===============>>#3 票数:16

如果您的项目已经使用argLine配置surefire-maven-plugin,请确保将argLine定义为属性,而不是作为插件配置的一部分 例如:

  <properties>
    <argLine>-your -extra -arguments</argLine>
  </properties>
  ...
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
      <!-- Do not define argLine here! -->
    </configuration>
  </plugin>

生成的覆盖信息在执行期间收集,并且在进程终止时默认写入文件。

为我工作。 请参阅: http//www.eclemma.org/jacoco/trunk/doc/prepare-agent-mojo.html

===============>>#4 票数:11

尝试在属性部分添加argLine属性(如下面的代码所示),而不是在maven-sure-fire插件的配置部分添加它。 Jacoco maven插件只会附加到此,事情将按预期工作。

<properties>
  <argLine>-XX:MaxPermSize=512m</argLine>
</properties>

请参阅https://docs.sonarqube.org/display/PLUG/Usage+of+JaCoCo+with+Java+Plugin

===============>>#5 票数:4

我最近遇到了同样的问题,甚至隐含了与你描述的相同的步骤。 我找不到干净的解决方案。

所以我在调试模式下运行了几个步骤,似乎Maven两次替换属性。 正如我想的那样,这不只是一种懒惰的方式,而是以热切和懒惰的方式:

  1. 急切地 (在任何目标运行之前)被替换为静态属性(在POM的properties部分中定义,可能还有settings.xml),
  2. 懒惰 (在每次执行之前)被替换为动态属性。

这是我们将空白属性设置为默认值的步骤失败。 Maven刚刚去了:

  1. 急切替换默认值(空白)
  2. JaCoCo设定了动态价值
  3. 延迟替换动态值(现在没有什么可以替换,已经使用了空白值)

最后,解决方案是动态设置默认值。 这可以使用GMaven插件完成,如下所示:

<plugin>
  <groupId>org.codehaus.gmaven</groupId>
  <artifactId>gmaven-plugin</artifactId>
  <version>1.5</version>
  <executions>
    <execution>
      <id>set-default-values</id>
      <phase>initialize</phase>
      <goals>
        <goal>execute</goal>
      </goals>
      <configuration>
        <source>
          project.properties.'surefire.argLine' = ''
        </source>
      </configuration>
    </execution>
  </executions>
</plugin>

所以现在Maven去了:

  1. 急切替换静态属性
  2. GMaven动态设置默认值(如果配置文件处于活动状态)
  3. JaCoCo设定了动态价值
  4. Surefire使用正确设置的argLine运行

使用活动配置文件生成exec文件,使用非活动配置文件时,将使用空白默认值并构建成功。

===============>>#6 票数:4

我的解决方案是使用多个配置文件。

第一个配置文件为surefire.argLinefailsafe.argLine设置一个空值,默认情况下处于活动状态。

<profile>
    <id>not-sonar</id>
    <properties>
        <surefire.argLine/>
        <failsafe.argLine/>
    </properties>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
</profile>

第二个配置文件具有jacoco插件配置,默认情况下处于非活动状态。

<profile>
<id>sonar</id>
<activation>
    <activeByDefault>false</activeByDefault>
</activation>
<build>
    <plugins>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>${jacoco-maven-plugin-version}</version>
            <executions>
                <execution>
                    <id>default-prepare-agent</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                    <configuration>
                        <propertyName>surefire.argLine</propertyName>
                    </configuration>
                </execution>
                <execution>
                    <id>default-prepare-agent-integration</id>
                    <goals>
                        <goal>prepare-agent-integration</goal>
                    </goals>
                    <configuration>
                        <propertyName>failsafe.argLine</propertyName>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
</profile>

当您激活声纳配置文件时,将自动关闭非声纳配置文件。

这应该比使用其他插件为您完成工作更优雅。 您现在可以在argLine中使用${surefire.argLine} surefire.argLine ${surefire.argLine}变量,它将始终存在并在运行构建时设置。

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
      <argLine>${surefire.argLine} -XX:MaxPermSize=512m</argLine>
    </configuration>
  </plugin>

如果因为$ {surefire.argLine}没有值而仍然有问题,你也可以像这样设置一个虚拟属性:

<profile>
    <id>not-sonar</id>
    <properties>
        <surefire.argLine>-DdummyProperty=notUsed</surefire.argLine>
        <failsafe.argLine>-DdummyProperty=notUsed</failsafe.argLine>
    </properties>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
</profile>

===============>>#7 票数:2

我的解决方案是在maven-surefire-plugin中安全地使用argLine。

<plugin>
    <groupId>org.codehaus.groovy.maven</groupId>
    <artifactId>gmaven-plugin</artifactId>
    <version>2.0</version>
    <executions>
        <execution>
            <id>set-custom-arg-line</id>
            <phase>validate</phase>
            <goals>
                <goal>execute</goal>
            </goals>
            <configuration>
                <source>
                    def argLine = project.properties['argLine'];
                    if (argLine == null) {
                        argLine = "";
                    }
                    project.properties.argLine = argLine;
                </source>
            </configuration>
        </execution>
    </executions>
</plugin>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19.1</version>
    <configuration>
        <argLine>-Xmx1024m ${argLine}</argLine>
    </configuration>
</plugin>

===============>>#8 票数:1

对我来说,将版本从0.7.7.201606060606升级到0.7.9也修复了这个问题。

我必须明确地将版本添加到命令行(而不仅仅是pom),因为构建服务器保持使用旧版本。 这可以按如下方式完成:

 org.jacoco:jacoco-maven-plugin:0.7.9:prepare-agent

代替

org.jacoco:jacoco-maven-plugin:prepare-agent

jacoco插件站点(用于声纳)声明必须将argline添加为属性。 对我来说,在@{argLine}插件设置中使用@{argLine}时也可以使用它。

===============>>#9 票数:1

将POM.xml更新为

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

<plugin>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>2.12.1</version>
      <configuration>
         <argLine>${argLine} -XX:PermSize=256m -XX:MaxPermSize=1048m</argLine> 
      </configuration>
</plugin>

然后最重要的是运行具有目标的Maven项目: mvn jacoco:prepare-agent clean test jacoco:report

===============>>#10 票数:0

我添加了一个Maven / Java项目,其中包含1个具有以下功能的域类:

  • 使用插件Surefire和Failsafe进行单元或集成测试
  • FindBugs的。
  • 通过Jacoco测试覆盖率。

我让项目尽可能简单。 该项目在示例项目中将这些和其他帖子的许多建议放在一起。 谢谢,贡献者!

自述文件给出了简要说明。 它解释了如何使用Jacoco运行用户或集成测试。

请享用!

  ask by John Q Citizen translate from so

未解决问题?本站智能推荐: