首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Maven JaCoCo插件错误

Maven JaCoCo插件错误
EN

Stack Overflow用户
提问于 2012-09-05 02:46:06
回答 5查看 63.6K关注 0票数 22

我已经在我的pom.xml文件中配置了Maven JaCoCo插件,如下所示:

代码语言:javascript
运行
复制
<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>

我使用的是Windows7和apache-maven-3.0.4插件。无论是从cygwin终端还是从命令提示符终端输入mvn -P jacoco4 install,Maven都会下载并运行JaCoCo插件,但是jacoco.exec文件似乎并未创建。以下是错误消息:

代码语言:javascript
运行
复制
[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)

无论我是否在插件的配置中包含destfiledatafile说明符,都会出现此错误消息:

代码语言:javascript
运行
复制
<destfile>${project.build.directory}/target/jacoco.exec</destfile>
<datafile>${project.build.directory}/target/jacoco.exec</datafile>

有人能告诉我我哪里做错了吗?

EN

回答 5

Stack Overflow用户

发布于 2012-09-17 20:28:53

我在jacoco和maven上也遇到了同样的问题。这与父pom覆盖了surefire的配置有关。在本例中,插件没有使用定义代理参数(用于jvm参数)。

解决方案是将"argLine“配置元素放回原处

代码语言:javascript
运行
复制
<plugin>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
   <argLine>${argLine}</argLine>
  </configuration>
 </plugin>

完整的plugin conf如下所示

代码语言:javascript
运行
复制
<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>

希望它会有用

票数 28
EN

Stack Overflow用户

发布于 2015-05-01 02:31:39

好了,我想我知道是怎么回事了。

默认情况下,jacoco插件在测试阶段之前“运行”(通常它在initialize生命周期阶段运行prepare-agent目标),当它运行时,它只是将一个名为"argLine“的maven属性设置为类似于-javaagent=jacoco.jar的值

例如:

设置为-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的

INFO argLine

默认情况下,maven-surefire-plugin基本上会将此属性(如果设置为任何值)添加到其派生的java测试进程中,这样它们就会得到好处。例如:java ${argLine ends up here}> -jar /xxx/surefirebooter3741906822495182152.jar

通常(不使用jacoco),如果您还想向该argLine添加自己的其他内容(例如,-Xmx1G等),则只需在surefire配置中设置它,例如

代码语言:javascript
运行
复制
 <build>
   <plugins>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
         <configuration>
            <argLine>-Xmx1G</argLine>
          </configuration>
     </plugin>

但是,如果您使用的是jacoco,则不能通过设置全局属性this way (这是pom的根全局属性)来执行此操作:

代码语言:javascript
运行
复制
  <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 (为您设置的是one jacoco )。(我不清楚是否有一种简单的方法可以“增加”父pom的值,如果有人知道如何在这里自由评论的话)。

但是,如果jacoco不是针对某个目标或某个配置文件运行的呢?则永远不会设置变量${argLine},您可能会遇到如下错误:

目标org.apache.maven.plugins:maven-surefire-plugin:2.14:test的

执行默认值-测试失败:派生的VM在没有正确道别的情况下终止。虚拟机崩溃还是调用了System.exit?错误命令为/bin/sh -c cd ...java '${argLine}‘...

事实证明,当jacoco运行时,它只“添加”到名为argLine的属性中。因此,您可以安全地将<properties><argLine></argLine></properties>添加到您的pom中(除非您已经在父pom中设置了该设置,否则不需要添加任何内容)。如果jacoco被调用,它会添加到其中。如果不是,则将其设置为空字符串,这是可以的。也不清楚是否有一种方法可以“添加”属性的父值,因此它要么继承它,如果你知道它存在,要么指定它为空。

所以,最后对我来说,由于我的上游(无法访问)父pom声明它是这样的

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

我被迫基本上遵循这条路线,因为它已经设置在一个(不受我控制的)父pom中,因此:

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

注意,如果你的pom中有这个,Intellij将会抱怨并且“不会在你的单元测试中添加任何设置”:

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

但是,根本不要声明一个名为argLine的属性(即使它在命令行mvn上工作得很好)。修复/解决方法:声明一个空的'argLine‘全局属性,和/或只是将您的-DcustomOption=X移到属性声明中,请参见上面的内容。如果你“只”在属性声明中设置它,那么为了让IntelliJ获取它,你还需要<configuration><argLine>${argLine}</argLine>... :|

不幸的是,即使这样还不够,尽管它可以与IntelliJ + maven一起工作,但它还是对声纳进行了冲洗。不知道为什么。改变了我解析时间的方式,这样就不必弄乱区域(也就是在代码中“正确地处理它们”)。

票数 20
EN

Stack Overflow用户

发布于 2014-08-29 23:18:29

我也遇到了这个问题: JaCoCo不会生成'jacoco.exec‘输出文件,这意味着不会发生代码覆盖率分析。

在我的例子中,这也是因为在Maven Surefire插件中使用了自定义的argLine,它覆盖了JaCoCo Maven插件的argLine,导致JaCoCo不能执行。

为了解决这个问题,我使用了JaCoCo可选参数"propertyName“将其argLine导出到Maven属性中,并将其包含在Surefire argLine中:

代码语言:javascript
运行
复制
<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会失败。

向pom添加空白属性"jacoco.agent.argLine“解决了运行单个测试时的问题,但这也阻止了JaCoCo在执行时导出其argLine,从而有效地禁用了JaCoCo。

我使用的解决方案的最后一部分是添加一个配置文件,该配置文件创建空白属性,并仅在指定单个测试时激活:

代码语言:javascript
运行
复制
<profiles>
    <profile>
        <activation>                
            <property>
                <name>test</name>      
            </property>
        </activation>
        <properties>
            <jacoco.agent.argLine></jacoco.agent.argLine>
        </properties>
    </profile>
</profiles>
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12269558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档