我已经在我的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>
我使用的是Windows7和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)
无论我是否在插件的配置中包含destfile
和datafile
说明符,都会出现此错误消息:
<destfile>${project.build.directory}/target/jacoco.exec</destfile>
<datafile>${project.build.directory}/target/jacoco.exec</datafile>
有人能告诉我我哪里做错了吗?
发布于 2012-09-17 20:28:53
我在jacoco和maven上也遇到了同样的问题。这与父pom覆盖了surefire的配置有关。在本例中,插件没有使用定义代理参数(用于jvm参数)。
解决方案是将"argLine“配置元素放回原处
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>${argLine}</argLine>
</configuration>
</plugin>
完整的plugin conf如下所示
<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>
希望它会有用
发布于 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配置中设置它,例如
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<argLine>-Xmx1G</argLine>
</configuration>
</plugin>
但是,如果您使用的是jacoco,则不能通过设置全局属性this way (这是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 (为您设置的是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一起工作,但它还是对声纳进行了冲洗。不知道为什么。改变了我解析时间的方式,这样就不必弄乱区域(也就是在代码中“正确地处理它们”)。
发布于 2014-08-29 23:18:29
我也遇到了这个问题: JaCoCo不会生成'jacoco.exec‘输出文件,这意味着不会发生代码覆盖率分析。
在我的例子中,这也是因为在Maven Surefire插件中使用了自定义的argLine,它覆盖了JaCoCo Maven插件的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会失败。
向pom添加空白属性"jacoco.agent.argLine“解决了运行单个测试时的问题,但这也阻止了JaCoCo在执行时导出其argLine,从而有效地禁用了JaCoCo。
我使用的解决方案的最后一部分是添加一个配置文件,该配置文件创建空白属性,并仅在指定单个测试时激活:
<profiles>
<profile>
<activation>
<property>
<name>test</name>
</property>
</activation>
<properties>
<jacoco.agent.argLine></jacoco.agent.argLine>
</properties>
</profile>
</profiles>
https://stackoverflow.com/questions/12269558
复制相似问题